我写
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('hacked')%3C/script%3E
$_SERVER['PHP_SELF']:
/form.php/"><script>alert('hacked')</script>
htmlspecialchars($_SERVER['REQUEST_URI']):
/form.php/"><script>alert('hacked')</script>
我认为,第二个也应该是最后一个......?
答案 0 :(得分:3)
听起来你htmlspecialchars
与urlencode
混淆了。
htmlspecialchars
用&
替换具有特殊含义的字符 - 转义实体。因此,例如,'
变为'
。但是,它不会将%22
转换为"
,因为%22
在HTML中没有特殊含义,因此无需修改就可以安全地显示它。
urlencode
使用%
使用十六进制字符代码替换URL 中具有特殊含义的字符。因此,例如,"
变为%22
。
如果您希望表单由用于显示表单的网址处理,请始终使用action=""
而不是action=<?=$_SERVER['PHP_SELF']?>
或action=<?=$_SERVER['REQUEST_URI']?>
。正如您已经发现的那样,如果您使用$_SERVER
变量中的任何一个,则存在跨站点脚本(XSS)的严重风险,因为它们包含用户输入,因此无法信任。因此,除非您有充分的理由需要以某种方式调整URL,否则只需使用action=""
。