问题

在《web前端黑客技术揭秘》的6.2.3 URL 编码差异中,test.php文件是:

<?php
echo '<h3>$_SERVER["QUERY_STRING"]</h3>';
echo $_SERVER['QUERY_STRING'];
echo '';
echo 'in &lt;input&gt; <input type="text" value="'.$_SERVER["QUERY_STRING"].'"/>';
//echo '<h3>$_GET["c"]</h3>';
//echo $_GET["c"];
//echo '';
//echo 'in &lt;input&gt; <input type="text" value="'.$_GET["c"].'" />';
?>

其中echo 'in &lt;input&gt; <input type="text" value="'.$_SERVER["QUERY_STRING"].'" //echo 'in &lt;input&gt; <input type="text" value="'.$_GET["c"].'" />';稍微有点难懂。

解释

这里选第2句说一下。其实它分为三个子字符串

  1. echo 'in &lt;input&gt; <input type="text" value="'
  2. $_GET["c"]
  3. "/>

因为.是字符串连接符。

正常

正常用户会提交1这样的合法输入,形成echo in &lt;input&gt; <input type="text" value="1"/>,显示到页面就是:

web前端黑客技术揭秘 6.2.3URL编码差异 笔记

恶意

而恶意用户会提交"><script>alert(/xeye/)</script>

形成

echo in &lt;input&gt; <input type="text" value=""><script>alert(/xeye/)</script>"/>  

可以看到恶意输入首先闭合属性,接着闭合input标签。接着添加script标签执行alert命令。

在谷歌浏览器被过滤了,而在火狐浏览器上没有被过滤,可以弹框。

web前端黑客技术揭秘 6.2.3URL编码差异 笔记