为什么使用$ _SERVER ['PHP_SELF']而不是""

rob*_*k27 41 php forms

在PHP页面上的表单中,您可以使用:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>
Run Code Online (Sandbox Code Playgroud)

要么

<form action="#" ...>
Run Code Online (Sandbox Code Playgroud)

要么

<form action="" ...>
Run Code Online (Sandbox Code Playgroud)

在表单的action属性中.由于echo $_SERVER['PHP_SELF']不传递变量以供使用GET而你必须使用"",为什么要使用它"#"

我问,因为我花了一些时间才弄清楚变量是不是通过的$_SERVER['PHP_SELF'].谢谢.

Nie*_*sol 62

action属性将默认为当前URL.这是说"将表单提交到它来自同一个地方"的最可靠和最简单的方法.

没有理由使用$_SERVER['PHP_SELF'],也#根本没有提交表单(除非submit附加了处理提交的事件处理程序).

  • 根据HTML标准(无论如何对于HTML4),`action`属性是必需的,并且必须具有URI(由http://www.ietf.org/rfc/rfc2396.txt定义)或者是未定义的行为(http) ://www.w3.org/TR/html401/interact/forms.html#adef-action).空字符串是否被视为有效的URI?(值得注意的是,我总是使用`action ="";我只是好奇我们是否都依赖于未定义的行为 - 我现在正在阅读URI RFC,但是有人可能已经知道了.) (22认同)
  • 在HTML5中,规范说`action`属性不是强制性的.http://stackoverflow.com/a/7048874/582917 (8认同)

Thi*_*ter 43

使用空字符串非常精细,实际上比简单使用更安全$_SERVER['PHP_SELF'].

使用$_SERVER['PHP_SELF']它时很容易通过简单地附加到URL /<script>...whatever.php一部分之后注入恶意数据,因此您不应该使用此方法并停止使用任何建议它的PHP教程.

  • @Tyzoid它可能是某个_else's_版本的页面带有超链接,这是你开始遇到麻烦的时候.例如,这个看似无害的链接:[http://www.google.com](http://example.com/mypage.php?MALICIOUS_JAVASCRIPT) (3认同)
  • 我怀疑大多数人都认为PHP_SELF是用户输入。 (2认同)

Mar*_*ich 23

当您将ANY变量插入HTML时,除非您希望浏览器将变量本身解释为HTML,否则最好htmlspecialchars()在其上使用.除此之外,它还可以防止黑客在您的页面中插入任意HTML.

$_SERVER['PHP_SELF']直接取自浏览器中输入的URL.因此,如果您在没有它的情况下使用它htmlspecialchars(),则允许黑客直接操作代码的输出.

例如,如果我通过电子邮件向http://example.com/"><script>malicious_code_here()</script><span class="您发送了您的链接<form action="<?php echo $_SERVER['PHP_SELF'] ?>">,则输出将为:

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">
Run Code Online (Sandbox Code Playgroud)

我的脚本会运行,你就不会更聪明了.如果您已登录,我可能会窃取您的Cookie,或从您的网页上删除机密信息.

但是,如果您使用<form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']) ?>">,输出将是:

<form action="http://example.com/&quot;&gt;&lt;script&gt;cookie_stealing_code()&lt;/script&gt;&lt;span class=&quot;">
Run Code Online (Sandbox Code Playgroud)

当你提交表单时,你会有一个奇怪的URL,但至少我的邪恶脚本没有运行.

另一方面,如果您使用了<form action="">,那么无论我添加到链接中,输出都是相同的.这是我建议的选项.


Mic*_*a93 11

我知道问题是两年了,但这是我要找的第一个结果.我找到了一个很好的答案,我希望我可以帮助其他用户.

看这个

我将简要介绍一下:

  • 使用$_SERVER["PHP_SELF"]带有htmlspecialchars()的变量:

    `htmlspecialchars($_SERVER["PHP_SELF"]);`
    
    Run Code Online (Sandbox Code Playgroud)
  • PHP_SELF返回当前正在执行的脚本的文件名.

  • htmlspecialchars()函数的特殊字符转换为HTML实体. - >没有XSS