11

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

if( ! empty( $_POST ) ) { }

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

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

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

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

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

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

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

4

2 回答 2

10

是的,它仍然存在,并且仍然 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 应该被认为已经死了。

于 2012-06-12T15:05:24.290 回答
5

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

该变量还表示请求是 ' GET'、' HEAD'、' POST' 还是 ' PUT' 请求。

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

于 2012-06-12T15:05:52.510 回答