【问题标题】:Is $_SERVER['REQUEST_METHOD'] still viable?$_SERVER['REQUEST_METHOD'] 仍然可行吗?
【发布时间】:2012-06-12 14:58:46
【问题描述】:

所以,一段时间以来,我一直在使用以下内容来检查我的帖子数据是否已设置。

if( ! empty( $_POST ) ) { }

但是最近我看到很多帖子说上面是“hack”,下面是正确的“更好”的方式。

if( $_SERVER[ 'REQUEST_METHOD' ] === 'POST' ) { }

最近我的意思是我最近才发现它。所有讨论后一种方法的帖子都来自 2009 年。编码标准有点老了,所以我认为对这个话题有新的看法是可以的。

我开始明白这两种方法是不同的。第一个被认为是“hack”,它只检查是否设置了 post 数组,如果发出 post 请求,就会发生这种情况。第二个实际上检查服务器以查看是否已发出发布请求。我想第二个可能会更安全一些,但如果信息被清除,我看不出它有什么不同。

我还看到了后者仅在 PHP 版本 $_REQUEST 全局,这是 PHP 编码人员用来确定某些请求参数来源的方式.我不确定最后一个陈述有多准确,因为旧帖子中提出的问题与我的相同。他们使用全局而不是请求。然而,这是一篇比其他任何一篇文章都更新的文章(2011 年),并且来自我信任的来源。所以我不知道该怎么做。

检查get时该怎么做?我看到有几个地方说服务器请求方法在这种情况下似乎不起作用,我只能假设这是因为 post 取代了 get 并且请求方法只能保存一个参数。因此,如果您同时拥有发布和获取数据,您会怎么做?对其中一篇文章的评论建议使用全局请求而不是发布和获取,但我一直认为这是一个坏主意。

This 是我能找到的最新来源,我在提交之前通过查看旁边的类似问题来做到这一点。它专门询问使用提交值来检查表单是否通过,但它也提到了请求方法。很多似乎表明后者仍在普遍使用。那么这个建议仍然有效吗?检查请求方法仍然是最佳选择吗?

【问题讨论】:

标签: php


【解决方案1】:

是的,它仍然存在,并且仍然 100% 可靠。 $_SERVER["REQUEST_METHOD"] var 是 PHP 自己设置的,根据用户连接使用的实际请求方式。用户无法发送查询参数或以其他方式影响该 var 的值,除非通过更改请求类型。

您的if(!$_POST) 不可靠,因为它可以执行一个帖子但不能通过它发送任何数据,例如:

<form method="post">
<input type="submit" />
</form>

将生成这样一个空的 $_POST 数组 - 表单中没有命名的表单元素,因此不会发送任何数据,但仍会执行 POST。

我不会担心 PHP4 没有这个超全局。 PHP 4 是石器时代的版本,支持 v4 但基于 v5 构建的代码必须包含如此多丑陋/恶心的 hack 才能实现向后兼容性,以至于任何必须处理该代码的人都会遭受噩梦的折磨。 PHP 4 应该被认为已经死了。

【讨论】:

  • 那么你将如何检查获取变量?随着请求方法被发布,您不能再次使用它来检查获取。或者仅仅是 get 已经不可靠,所以可以做的最好的事情就是确保数组不为空?顺便说一句:并不是真的担心 PHP4,该评论的来源解释说这是请求方法的原因,这显然是错误的。
  • 什么意思,检查获取变量?这就是为什么有$_GET$_POST 用于发布...
  • 当您需要检测帖子但可能没有任何值时,带有单个复选框的表单可能是一个更现实的示例。
  • 我的意思是 get 有类似的东西。即($_SERVER[ 'REQUEST_METHOD' ] === 'GET'),除非该示例在有后会话时不起作用,因为它会覆盖它。还是我只是继续检查get数组是否为空?即(! empty( $_GET )
  • 哦。在发帖时传递获取变量?如果 URL 中有查询变量,则无论请求方法如何,都会设置 $_GET。只需检查您想要的任何 get var 是否存在,例如 . if (isset($_GET['queryvar'])) { ... }.
【解决方案2】:

我总是使用$_SERVER['REQUEST_METHOD'];变量来检查请求方法。

此变量还表示请求是“GET”、“HEAD”、“POST”还是“PUT”请求。

http://php.net/manual/en/reserved.variables.server.php

【讨论】:

    猜你喜欢
    • 2022-06-21
    • 2010-09-29
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多