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

时间:2012-12-30 18:22:24

标签: php forms

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

<form action="<?php echo $_SERVER['PHP_SELF']; ?>" ...>

<form action="#" ...>

<form action="" ...>

在表单的action属性中。由于echo $_SERVER['PHP_SELF']未传递使用GET的变量,而您必须使用"",为什么要使用它或"#"

我问,因为我花了一些时间才发现变量没有通过$_SERVER['PHP_SELF']传递。感谢。

6 个答案:

答案 0 :(得分:59)

action属性将默认为当前网址。这是说“将表格提交到它来自同一个地方”的最可靠和最简单的方法。

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

答案 1 :(得分:43)

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

使用$_SERVER['PHP_SELF']时,只需在/<script>...部分后添加whatever.php即可轻松注入恶意数据,因此您不应使用此方法并停止使用任何PHP教程这表明了它。

答案 2 :(得分:22)

当您将 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="">

我的脚本会运行,你就不会更聪明了。如果您已登录,我可能会盗取您的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;">

当您提交表单时,您有一个奇怪的网址,但至少我的恶意剧本没有运行。

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

答案 3 :(得分:10)

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

Look at this

我将简要介绍一下:

  • $_SERVER["PHP_SELF"]变量与htmlspecialchars():

    一起使用
    `htmlspecialchars($_SERVER["PHP_SELF"]);`
    
  • PHP_SELF返回当前正在执行的脚本的文件名。

  • htmlspecialchars()函数将特殊字符转换为HTML实体。 - &GT;没有XSS

答案 4 :(得分:0)

除上述答案外,另一种方法是使用$_SERVER['PHP_SELF']或仅使用空字符串{@ 1}}。
如果您的PHP版本较低(<5.3),则更常见的替代方法是使用__DIR__
Both返回上下文中文件的文件夹名称。

修改
正如Boann所指出的,这会返回文件的磁盘位置。你不会理想地将其暴露为网址。在这种情况下,dirname(__FILE__)可以在上下文中返回文件的文件夹名称。

答案 5 :(得分:-2)

没有区别。 $ _SERVER ['PHP_SELF']只会使执行时间减慢0.000001秒。