为什么htmlspecialchars在';PHP#u SELF';而不是在';请求URI';寄表格?
我写 在URL上。现在我按enter键,URL为:为什么htmlspecialchars在';PHP#u SELF';而不是在';请求URI';寄表格?,php,forms,post,action,htmlspecialchars,Php,Forms,Post,Action,Htmlspecialchars,我写 在URL上。现在我按enter键,URL为: http://www.mysite.com/form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E 我认为,第二个也应该是最后一个…?听起来你把htmlspecialchars和urlencode搞混了 htmlspecialchars将HTML中具有特殊含义的字符替换为&-转义实体。因此,例如,”变成了'。但是,它不会将%22转换为“,因为%22在HTML中没有特殊意义,所以可
http://www.mysite.com/form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
我认为,第二个也应该是最后一个…?听起来你把
htmlspecialchars
和urlencode
搞混了
htmlspecialchars
将HTML中具有特殊含义的字符替换为&
-转义实体。因此,例如,”
变成了'代码>。但是,它不会将%22
转换为“
,因为%22
在HTML中没有特殊意义,所以可以安全地显示它而不进行修改
urlencode
使用%
将URL中具有特殊含义的字符替换为十六进制字符代码。例如,“
变为%22
如果希望表单由用于显示它的同一URL处理,请始终使用action=“
而不是action=
或action=
。正如您已经了解到的,如果您使用$\u SERVER
变量中的任何一个,都存在跨站点脚本(XSS)的严重风险,因为它们包含用户输入,因此不可信。因此,除非您有充分的理由需要以某种方式调整URL,否则只需使用action=”“
回答操作部分。我更喜欢使用$\u SERVER['SCRIPT\u NAME']
而不是PHP\u SELF
/REQUEST\u URI
或任何其他内容,因为它只包含/folder/form.PHP
并且在.PHP
之后没有任何内容,所以您不会像尝试使用脚本标记一样获得任何XSS内容。如果您需要.php
之后的参数,我建议您创建一个打印安全值的脚本action=”“
在使用时会发送到当前页面,这可能会更安全,但是SCRIPT\u NAME
工作正常。感谢您的详细回复。我想知道,使用action=“”,使用$\u SERVER[…]来调整URL的好理由是什么?谢谢你有时候,你可能别无选择。最困难的情况是,您必须重定向某人,例如用户登录后,您需要将他们发送到最初请求的页面。那可能很难。谢谢你。。。在我的网站上,我通过以下方式解决了这种情况:1)用户请求www.mysite.com/admin/page.php
2)未登录的用户被重定向到/admin/login.php
,但在此之前,我与最初请求的页面设置了$\u会话。3) 用户登录,如果设置了$\会话,用户将被发送到最初请求的页面,或者发送到/admin/index.php
。你的写作方式更好/更恰当吗?谢谢,两个都可以。使用$\u SESSION
而不是action=“…”
的优点是它不会将URL直接回送到HTML中,因此至少XSS不会以这种方式工作。不过,您仍然需要注意CSRF和其他一些攻击。看看这本书。
http://www.mysite.com/form.php/"><script>alert('hacked')</script>
$_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>