为什么htmlspecialchars在';PHP#u SELF';而不是在';请求URI';寄表格?

为什么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中没有特殊意义,所以可

我写

在URL上。现在我按enter键,URL为:

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(&#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;