43

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

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

或者

<form action="#" ...>

或者

<form action="" ...>

在表单的 action 属性中。既然 echo$_SERVER['PHP_SELF']不传递变量来使用GET并且你必须使用"",你为什么要使用它"#"

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

4

6 回答 6

65

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

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

于 2012-12-30T18:26:46.210 回答
46

使用空字符串非常好,实际上比简单地使用$_SERVER['PHP_SELF'].

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

于 2012-12-30T18:27:40.573 回答
26

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

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

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

于 2014-09-06T18:03:04.983 回答
11

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

看这个

我将简要介绍一下:

  • $_SERVER["PHP_SELF"]变量与htmlspecialchars() 一起使用:

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

  • ( htmlspecialchars) 函数将特殊字符转换为 HTML 实体。--> 没有 XSS
于 2015-11-25T13:57:35.537 回答
0

除了上述答案之外,另一种方法是$_SERVER['PHP_SELF']或简单地使用空字符串是使用__DIR__.
或者
如果您使用的是较低的 PHP 版本(<5.3),更常见的替代方法是使用dirname(__FILE__)
两者都返回上下文中文件的文件夹名称。

编辑
正如 Boann 指出的那样,这将返回文件的磁盘位置。理想情况下,您不会将其公开为 url。在这种情况下,dirname($_SERVER['PHP_SELF'])可以在上下文中返回文件的文件夹名称。

于 2013-08-25T23:17:48.663 回答
-4

没有区别。$_SERVER['PHP_SELF'] 只是让执行时间慢了 0.000001 秒。

于 2012-12-30T20:54:34.930 回答