设为首页 收藏本站
查看: 1343|回复: 0

shell解析URL发送来的QUERY_STRING编码字符串——futter心得

[复制链接]

尚未签到

发表于 2015-12-15 14:17:57 | 显示全部楼层 |阅读模式
shell解析URL发送来的QUERY_STRING编码字符串

一、数据形式
    web通过表单方式,利用get或者post方法,想cgi发送客户端的输入数据时,整个数据编码字符串都附加在服务器URL的后面。
    当用户点击提交按钮时,相应的信息被赋给变量QUERY_STRING,这些信息是以下面的格式编码的:
    所有的空格用 来代替。
    所有的值域用&隔开。
    所有的值和相应域用=隔开。
    所有的符号和一些特殊字符用%xy的形式表示,其中xy是该字符的16进制ascii码。看一下QUERY_STRING的变量就知道,在textarea变量中含有很多这样的字符。
    cgi协议证明,所有采用%xy形式表示的特殊字符(其中xy为16进制数)都被转换为相应的ascii字符。这种16进制字符包括特殊字符&、%、 、=、(、)及所有ascii码超过127的其他特殊字符。例如字符”(“应为).
    这种16进制字符产生与文本框,用户可能会在这些地方输入这样的字符。不过,他们也可以出现在下拉式列表框中。
    为了解码相应字符串,我们应当:
    将所有的&替换成换行。
    将所有的 替换为空格。
    将所有的=替换成空格。
    将所有的%xy替换对应的ascii字符。
    在完成上述转换之后,我们可能需要访问某个变量,这样就可以根据用户发送的信息来进行某些处理。解码只是所有工作的一部分,尽管这是最繁重的一部分。如果想访问这些变量,可以使用eval命令。


二、数据输入实例

DSC0000.jpg
    上图为一web表单样例程序,有一文本框,两个下拉式列表框,两个复选框、一个区域文本框和输入型按钮。各操作项name\type如下:





  • your name:





  • -- Pick a IP--

  • 192.168.18.111

  • 192.168.18.222

  • 192.168.18.333







  • -- Pick a mask--

  • 255.255.255.0

  • 255.255.0.0

  • 255.0.0.0







  • -- Pick a gateway--

  • 192.168.18.1

  • 192.168.18.2

  • 192.168.18.3







  • do you watch films at the ..

  • Cinema

  • On video







  • tell what is your film,or just enter some comments








    如web图例所示,文本框输入带有空格的姓名内容,复选框全部选中,区域文本框有%()等特殊字符。
    从服务器查看QUERY_STRING,数值,得到数值如下:




  • results from a get form
  • REQUEST_METHOD : GET
  • QUERY STRING : contact=wang wei&ip=192.168.18.111&mask=255.255.255.0&gateway=192.168.18.1&view_cine=on&view_vid=on&textarea=~!@#$%^&*()()%%$#%q%2
    从上图可以看出,带空格的文本框内容,空格被 字符代替,所有值域用&字符隔开。所有值和相应域用=字符隔开。区域文本框中的特殊字符用%xy代替。
    那么如何把QUERY_STRING的各值和相应域取出来呢?请往下看。


三、解析QUERY_STRING字符串
方法一:




  • #!/bin/sh

  • echo "Content-type: text/html"

  • echo ""

  • echo ""

  • echo ""

  • echo "results from a get form"

  • echo "REQUEST_METHOD : $REQUEST_METHOD"

  • echo "QUERY STRING : $QUERY_STRING"

  • echo ""

  • LINE=`echo $QUERY_STRING | sed 's/&/ /g'`   

  • for LOOP in $LINE   

  • do      

  •     NAME=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`

  •     TYPE=`echo $LOOP | sed 's/=/ /g' | awk '{print $2}' | sed -e 's/%\(\)/\\\x/g' | sed 's/+/ /g'`     

  •     printf "${NAME}=${TYPE}\n"

  •     VARS=`printf "${NAME}=${TYPE}\n"`

  •     #echo $VARS

  •     eval `printf $VARS`

  • done

  • echo ""

  • echo ""

  • printf "your name is                 : $contact\n"

  • printf "your choice of ip is         : $ip\n"

  • printf "your chioce of mask is       : $mask\n"

  • printf "your chioce of gateway is    : $gateway\n"

  • printf "you watch film at the cinema : $view_cine\n"

  • printf "you watch film on video      : $view_vid\n"

  • printf " and here are your comments  : $textarea\n"



  • echo ""
上面代码中绿色部分,为解码代码,解码各域值如下:

DSC0001.jpg
方法二:



  • str=$QUERY_STRING

  • [ "${str%&}" = "$str" ] && str="$str&"

  • while [ -n "$str" ]; do

  • pair=${str%%&*}

  • var=${pair%=*}

  • val=${pair#*=}

  • str=${str#*&}

  • echo "$pair"

  • echo "$var"

  • echo "$val"

  • echo "$str"

  • echo "
    "


  • eval $(echo "PARM_$var"="$val")

  • done

解码结果如下:
contact=wang+wei
contact
wang+wei
ip=192.168.18.111&mask=255.255.255.0&gateway=192.168.18.1&view_cine=on&view_vid=on&textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

ip=192.168.18.111
ip
192.168.18.111
mask=255.255.255.0&gateway=192.168.18.1&view_cine=on&view_vid=on&textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

mask=255.255.255.0
mask
255.255.255.0
gateway=192.168.18.1&view_cine=on&view_vid=on&textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

gateway=192.168.18.1
gateway
192.168.18.1
view_cine=on&view_vid=on&textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

view_cine=on
view_cine
on
view_vid=on&textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

view_vid=on
view_vid
on
textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24&

textarea=%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24
textarea
%7E%21%40%23%24%25%5E%26*%28%29%25%28%29%25Q%25W%25%40%25%23%24






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151607-1-1.html 上篇帖子: shell脚本的调用方法和进程关系 下篇帖子: shell编写cgi,在openwrt运行
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表