$ _SERVER ['REQUEST_METHOD']仍然可行吗?

时间:2012-06-12 14:58:47

标签: php

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

if( ! empty( $_POST ) ) { }

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

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

最近我只是说我最近才找到它。正在讨论这个后来方法的所有帖子都来自2009年。编码标准有点旧,所以我认为可以对这个主题有新的看法。

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

我也看过帖子,后者仅用于PHP版本< = 4,因为PHP此时仍在使用$_REQUEST全局,这就是PHP编码器用来确定源代码的方式某些请求参数。我不确定最后一个陈述是多么准确,因为旧帖子中提出的问题与我的相同。他们使用post global而不是request。然而,这是一个比其他任何一个(2011年)更新的帖子,并且从我开始信任的来源。所以我不知道该怎么做。

检查获取时该怎么办?我已经看到有几个地方说服务器请求方法在这个实例中似乎不起作用,我只能假设它是因为post superscedes get而请求方法只能容纳一个参数。所以,如果您同时发布和获取数据,您会做什么?对其中一篇帖子的评论建议使用全局请求而不是发布和获取,但我一直认为这是一个坏主意。

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

2 个答案:

答案 0 :(得分:10)

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

您的if(!$_POST)不可靠,因为 IS 可能会执行帖子但不会发送任何数据,例如:

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

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

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

答案 1 :(得分:5)

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

此变量还会显示请求是“GET”,“HEAD”,“POST”还是“PUT”请求。

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