【问题标题】:When and why should $_REQUEST be used instead of $_GET / $_POST / $_COOKIE?何时以及为什么应该使用 $_REQUEST 而不是 $_GET / $_POST / $_COOKIE?
【发布时间】:2010-09-11 13:59:51
【问题描述】:

标题中的问题。

$_GET[foo]$_POST[foo]$_COOKIE[foo] exist? 中的哪一个都包含在$_REQUEST? 中时会发生什么

【问题讨论】:

  • 变量根据 php.ini 中的 gpc_order 被覆盖,你也应该用引号来访问你的变量,像这样:$_GET['foo']

标签: php


【解决方案1】:

$_REQUEST 只是阻止您测试 post、get 和 Cooking 的捷径,前提是数据可以来自这些中的任何一个。

有一些陷阱:

  • 数据取自 GET、POST 和最后的 COOKIE。最后一个覆盖第一个,所以要小心。
  • REST 架构需要分离 POST 和 GET 语义,在这种情况下您不能依赖 $_REQUEST

不过,如果您知道自己在做什么,那么这只是另一个方便的 PHP 技巧。

如果我想快速更新可能来自多个来源的变量,我会使用它。例如:

  • 在您的控制器中,无需检查请求是来自表单操作还是超文本链接,即可决定提供哪个页面。
  • 无论会话 id 的传输方式如何,都检查会话是否仍处于活动状态。

【讨论】:

    【解决方案2】:

    要回答“当所有 3 个都存在时会发生什么”的问题,答案是“视情况而定”。

    PHP 根据 PHP.INI 中的 request_order 指令(或 variables_order 如果 request_order 不存在)自动填充 $_REQUEST。默认值通常是“GPC”,这意味着首先加载 GET,然后加载 POST(如果有冲突,则覆盖 GET),然后加载 cookie(如果有冲突,则覆盖 get/post)。但是,您可以在 PHP.INI 文件中更改此指令。例如,将其更改为“CPG”会使 cookie 先加载,然后发布,然后获取。

    至于什么时候使用呢?我会回应“从不”的观点。你已经不信任用户了,为什么还要给用户更多的工具呢?作为开发人员,您应该知道您期望数据来自哪里。这一切都是为了减少您的攻击面。

    【讨论】:

      【解决方案3】:

      当我不希望人们轻松访问正在传递的内容时,我使用 POST,当我不介意他们看到 url 中的值时,我使用 GET。我通常不经常使用 cookie,因为我发现 SESSION 可以很好地保存值(尽管拥有适当的注册表是利用它的最佳方式)。

      【讨论】:

        【解决方案4】:

        我会说永远不会。

        如果我想通过各种方法设置某些内容,我会为每个方法编写代码以提醒自己我已经这样做了 - 否则您可能会在不知不觉中被覆盖。

        不应该是这样的吗:

        $_GET = 非破坏性操作(排序、记录操作、查询)

        $_POST = 破坏性操作(删除、更新)

        $_COOKIE = 琐碎设置(样式表首选项等)

        $_SESSION = 重要设置(用户名、登录?、访问级别)

        【讨论】:

        • GET 与 POST 方法的优点,它们用于不同的目的。然而,如今很少有 Web 应用程序以这种方式工作......
        • 我一直认为这个想法是,如果您使用 get 删除内容,那么机器人可以抓取这些链接并因此删除数据库中的所有内容...听起来像一个恐怖故事,所以我一直坚持上面的架构。
        • 我们只是在工作中苦苦挣扎。我们的产品是一个 CMS 系统,它遵守上述规则。我们想为我们的客户提供 Google Mini 设备 www.google.com/enterprise/mini/,但不可能让它爬取 CMS 外联网,因为一切都会崩溃:/
        • 这很令人沮丧......在真正开始之前考虑这种事情是件好事!您可以在所有获取链接上尝试 rel="nofollow",然后逐渐删除您认为安全的链接 - 当然这仍然有点可怕,不确定 Google 对 nofollow 的严格程度。
        • @RichBradshaw 这在 2013 年帮助了我。哦,是的!
        【解决方案5】:

        有时您可能希望以多种不同的方式调用同一个脚本。我想到了表单提交和 AJAX 调用。然而,在大多数情况下,最好是明确的。

        另外,请参阅http://docs.php.net/manual/en/ini.core.php#ini.request-order,了解如果发生名称冲突,不同来源的变量如何相互覆盖。

        【讨论】:

          【解决方案6】:

          当您不确定值的填充位置或同时使用它们并希望通过 POST 和 GET 方法遍历所有值时。

          【讨论】:

            猜你喜欢
            • 2010-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多