- 论坛徽章:
- 3
|
学生党:飘过~下面简单实现表单传值,如果要传文件就调用curl或是嵌入tc代码上传
[root@redhat002 html]# cat index.cgi
#!/bin/bash
echo "Content-Type:text/html"
echo ""
#画个表格出来
echo '<table style="border:solid 1px red;width:800px;height=100%;text-align=center;"><tr><td>'
echo '<form action="index.cgi" method="get">命令:<input size="68" type="text" name="command" /><input type="submit" value="执行" /><br /></td></tr><tr><td>'
#加载获取键值脚本,获取执行command
source yhsafe_getkv.class.cgi
exec_command=`yhsafe_show_value`
#转换把那个URL中的+号全部转换成为空格,但是有的就会和linux命令冲突
pcre_command=$(echo $exec_command|sed 's/+/ /g')
#echo ${exec_command%%+*}
#echo ${exec_command//*+}
#判断如果是command被指定命令就返回执行结果
if [ -n ${exec_command} ];then
echo '<pre>'
eval ${pcre_command}
echo '</pre>'
fi
echo '</td></tr></table>'
[root@redhat002 html]#
[root@redhat002 html]# cat yhsafe_getkv.class.cgi
#!/bin/bash
#定义一个关系数组
declare -A GET
#循环读取一个键值对
while read -r key_value; do
#获取键
key=${key_value%%=*}
#如果键中没有包含一些乱七八糟的危险字符以及URL编码字符等就继续
if [[ -z "$key" || -z "${key##*[\$"'"'`''"'.%]*}" ]]; then
continue
fi
#获取值(严格过滤用)
#value=$(echo -e "$(echo "${key_value#*=}" | sed 's/+/ /g; s/%\([0-9a-fA-F]\{2\}\)/\\x\1/g')")
#获取值(针对LINUX命令)
value=$(echo -e "$(echo "${key_value#*=}" | sed 's/%\([0-9a-fA-F]\{2\}\)/\\x\1/g')")
#给关系数组赋值
eval "GET[$key]=\$value"
#用的是$QUERY_STRING把&换位换行符这样就可以逐行读取
done < <(echo "$QUERY_STRING" | sed 's/\&/\n/g')
#这个和PHP还有点儿不同包含的文件的值必须用函数传出去
function yhsafe_show_value(){
echo ${GET["command"]}
}
|
|