问题
在《web前端黑客技术揭秘》的6.2.3 URL 编码差异中,test.php文件是:
<?php
echo '<h3>$_SERVER["QUERY_STRING"]</h3>';
echo $_SERVER['QUERY_STRING'];
echo '';
echo 'in <input> <input type="text" value="'.$_SERVER["QUERY_STRING"].'"/>';
//echo '<h3>$_GET["c"]</h3>';
//echo $_GET["c"];
//echo '';
//echo 'in <input> <input type="text" value="'.$_GET["c"].'" />';
?>
其中echo 'in <input> <input type="text" value="'.$_SERVER["QUERY_STRING"].'"
和//echo 'in <input> <input type="text" value="'.$_GET["c"].'" />';
稍微有点难懂。
解释
这里选第2句说一下。其实它分为三个子字符串
echo 'in <input> <input type="text" value="'
$_GET["c"]
"/>
因为.
是字符串连接符。
正常
正常用户会提交1
这样的合法输入,形成echo in <input> <input type="text" value="1"/>
,显示到页面就是:
恶意
而恶意用户会提交"><script>alert(/xeye/)</script>
形成
echo in <input> <input type="text" value=""><script>alert(/xeye/)</script>"/>
可以看到恶意输入首先闭合属性,接着闭合input
标签。接着添加script
标签执行alert
命令。
在谷歌浏览器被过滤了,而在火狐浏览器上没有被过滤,可以弹框。