为什么htmlspecialchars在'PHP_SELF'上工作而在表单帖子上不在'REQUEST_URI'上?

时间:2014-01-19 04:29:19

标签: php forms post action htmlspecialchars

我写

http://www.mysite.com/form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

在网址上。现在我按回车键,URL为:

http://www.mysite.com/form.php/"><script>alert('hacked')</script>

现在我发布表格。使用$_SERVER['PHP_SELF']时,htmlspecialchars可以使用REQUEST_URI。为什么呢?

我应该何时以及为何使用action=""action=<?=$_SERVER['PHP_SELF']?>action=<?=$_SERVER['REQUEST_URI']?>

这里是帖子的结果:

$_SERVER['REQUEST_URI']:
  /form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

htmlspecialchars($_SERVER['REQUEST_URI']):
  /form.php/%22%3E%3Cscript%3Ealert(&#039;hacked&#039;)%3C/script%3E

$_SERVER['PHP_SELF']:
  /form.php/"><script>alert('hacked')</script>

htmlspecialchars($_SERVER['REQUEST_URI']):
  /form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;

我认为,第二个也应该是最后一个......?

1 个答案:

答案 0 :(得分:3)

听起来你htmlspecialcharsurlencode混淆了。

htmlspecialchars&替换具有特殊含义的字符 - 转义实体。因此,例如,'变为&#039;。但是,它不会将%22转换为&quot;,因为%22在HTML中没有特殊含义,因此无需修改就可以安全地显示它。

urlencode使用%使用十六进制字符代码替换URL 中具有特殊含义的字符。因此,例如,"变为%22

如果您希望表单由用于显示表单的网址处理,请始终使用action=""而不是action=<?=$_SERVER['PHP_SELF']?>action=<?=$_SERVER['REQUEST_URI']?>。正如您已经发现的那样,如果您使用$_SERVER变量中的任何一个,则存在跨站点脚本(XSS)的严重风险,因为它们包含用户输入,因此无法信任。因此,除非您有充分的理由需要以某种方式调整URL,否则只需使用action=""