【问题标题】:Why use $_SERVER['PHP_SELF'] instead of ""为什么使用 $_SERVER['PHP_SELF'] 而不是 ""
【发布时间】:2012-12-15 02:58:39
【问题描述】:

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

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

<form action="#" ...>

<form action="" ...>

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

我之所以这么问,是因为我花了一些时间才弄清楚变量没有通过$_SERVER['PHP_SELF'] 传递。谢谢。

【问题讨论】:

  • 我不太明白你的问题。你想达到什么目的?您是否尝试在通过 POST 发送表单时在 URL 中传递 GET 变量?
  • 您可以使用 argv 返回 GET 变量:php.net/manual/en/reserved.variables.server.php
  • 我更喜欢使用 $_SERVER['SCRIPT_NAME']
  • 好吧,我的主要问题是,当您可以使用 action="" 时,为什么有人会使用 $_SERVER['PHP_SELF']?另外,我在一个页面上有一个表单,它的 URL 中有变量,例如 www.example.com?id=43。如果我使用$_SERVER['PHP_SELF'],它不会得到变量,但使用"",它会得到。我知道我可能会做$_SERVER['PHP_SELF']?id=echo $id,但是当"" 有效时,为什么还要做所有这些额外的工作?
  • 我知道这很旧,但答案是很久以前,action 属性是必需的,根据 html 规范,您也应该提供完整的 URL。 IE 偏离了规范,当 action 属性丢失或为空时会回发到源 URL,firefox 也效仿,但是当 webkit 实现它时,他们决定它应该发回站点的根目录,所以你不能t 使用缺失/空操作并与跨浏览器兼容。最终,webkit 在更新的 HTML 规范更改后更改了它们的实现。

标签: php forms


【解决方案1】:

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

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

【讨论】:

  • 根据 HTML 标准(无论如何都适用于 HTML4),action 属性是必需的,并且必须有一个 URI(由 ietf.org/rfc/rfc2396.txt 定义),否则就是未定义的行为(w3.org/TR/html401/interact/forms.html#adef-action)。空字符串是否被视为有效 URI? (值得注意的是,我一直使用action="";我只是好奇我们是否都依赖于未定义的行为——现在正在阅读 URI RFC,但我想有人可能已经知道了。)
  • 我记得在某处读到,在 HTML5 标准中,action 属性可以留空。我会尝试寻找我在哪里读到的。
  • 在 HTML5 中,规范说action 属性不是强制性的。 stackoverflow.com/a/7048874/582917
【解决方案2】:

使用空字符串非常好,实际上比简单地使用$_SERVER['PHP_SELF'] 安全得多。

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

【讨论】:

  • -1 如果这是一个问题,您使用的是什么服务器软件?如果您使用的是正确配置的 apache2 或 nginx 服务器,则不应发生这种情况。
  • 因为你完全有能力在使用廉价共享网络空间时修改服务器配置,就像许多人仍然这样做......
  • 但这真的会在这种情况下产生影响吗?所以用户将 JS 注入到页面的 他的版本 中。他本可以使用检查器或萤火虫或任何其他可用工具来完成此操作。此外,使用廉价共享服务器的任何安全问题都会超过 IMO 这个问题。
  • @Tyzoid 它可能是某人的 else's 版本的带有超链接的页面,这就是你开始遇到麻烦的时候。例如,这个看似无害的链接:http://www.google.com
  • 我怀疑大多数人认为 PHP_SELF 是用户输入。
【解决方案3】:

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

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

例如,如果我通过电子邮件向您发送http://example.com/"&gt;&lt;script&gt;malicious_code_here()&lt;/script&gt;&lt;span class=" 的链接,而您拥有&lt;form action="&lt;?php echo $_SERVER['PHP_SELF'] ?&gt;"&gt;,则输出将是:

<form action="http://example.com/"><script>malicious_code_here()</script><span class="">

我的脚本会运行,而你不会更聪明。如果您已登录,我可能窃取了您的 cookie,或从您的页面上窃取了机密信息。

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

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

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

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

【讨论】:

  • 谢谢,这是我在最后一小时阅读它时遇到的最好的解释。
【解决方案4】:

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

Look at this

我会简要介绍一下:

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

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

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

【讨论】:

    【解决方案5】:

    除了上述答案之外,另一种方法是$_SERVER['PHP_SELF'],或者简单地使用空字符串是使用__DIR__

    如果您使用的是较低的 PHP 版本 (dirname(__FILE__)
    两者都返回上下文中文件的文件夹名称。

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

    【讨论】:

    • __FILE____DIR__ 是 PHP 文件的磁盘位置。 PHP_SELF 是面向服务器的 URL。完全不同。
    • @Boann 直到我在实时服务器上才知道其中的区别。在这种情况下,dirname($_SERVER['PHP_SELF']) 可以解决问题。尽管我在这里给出的解决方案在安装了 XAMPP 的 Windows 机器上帮助了我。
    【解决方案6】:

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

    【讨论】:

    • 这是错误的,PHP_SELF 可能很危险:stackoverflow.com/a/14093363/3906760
    • 我现在要开始反对了。 PHP_SELF 与危险无关。问题是 action= 应该使用 htmlspecialchars 无论你在它后面放什么。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多