我写
http://www.mysite.com/form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
在网址上。现在我按 Enter 键,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>
我想,第二个也应该是最后一个……?
最佳答案
听起来你很困惑htmlspecialchars
与 urlencode
。
htmlspecialchars
将 HTML 中具有特殊含义的字符替换为 &
-逃脱的实体。例如,'
变成'
。它不转%22
进入"
,但是,因为 %22
在 HTML 中没有特殊含义,因此无需修改即可安全显示。
urlencode
使用 %
将URL中具有特殊含义的字符替换为十六进制字符代码。例如,"
变成%22
.
如果您希望表单由用于显示表单的同一 URL 进行处理,请始终使用 action=""
而不是action=<?=$_SERVER['PHP_SELF']?>
或action=<?=$_SERVER['REQUEST_URI']?>
。正如您已经发现的,如果您使用 $_SERVER
中的任何一个,则存在严重的跨站点脚本 (XSS) 风险。变量,因为它们包含用户输入,因此不可信。因此,除非您有充分的理由需要以某种方式调整 URL,否则只需使用 action=""
.
关于php - 为什么 htmlspecialchars 在表单发布的 'PHP_SELF' 上工作,而不在 'REQUEST_URI' 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21213219/