为什么我应该使用$_GET和$_POST而不是$_REQUEST?

9
除了 $_REQUEST 读取 cookies 的事实之外,我是否应该使用 $_GET 和 $_POST 而不是 $_REQUEST?使用它们的理论和实践原因是什么?
7个回答

11

当我只需要从用户那里获取特定数据并返回特定数据时,我使用 $_REQUEST。

永远不要在请求会产生副作用的情况下使用 $_REQUEST。产生副作用的请求应该是 POST(出于语义原因,以及基本的 CSRF 问题,虚假的 img 标签可以命中任何 GET 端点而用户甚至都不知道)。

当 GET 或 POST 到一个页面会产生不同结果时,应该使用 $_GET。


4
恭喜您获得了第一个被接受的答案 :) 欢迎来到stackoverflow.com! - Tom

8
除了$_REQUEST从cookies中读取之外,这是未定义的(它在每个安装级别上都是可配置的),使用$_REQUEST的问题在于它过分简化了事情。GET请求和POST请求之间应该有(或者应该有)语义差异。因此,如果您从一个来源或另一个来源获取输入,那么对于您的应用程序来说应该很重要。这就是HTTP协议的定义方式,因此忽略它会削弱协议,使您的应用程序更不互操作。这与使用语义HTML标记而不是面向表示的标记相同。或者更普遍地说,遵循协议的意图,而不仅仅是在具体情况下做任何有效的事情。

5

你已经给出了一个答案,所以我再给另外一个:

这更多是一种风格选择。例如,通常不希望服务器上的状态更改信息被缓存,因此可能需要将其限制为$_POST变量。


优秀的答案!希望能看到更多这样的回答。 - Tom

4

使用 $_REQUEST 存在一些攻击向量,可能会在你不希望发生的地方被覆盖变量。

同时考虑GPC顺序(Get、Post、Cookie),$_REQUEST 的填充顺序也会受到影响。

例如,一个请求包含:

$_GET['foo'] = 'bar'
$_POST['foo'] = 'baz'

将导致

$_REQUEST['foo'] == 'bar'


请注意,如果您控制php.ini,可以更改填充请求变量的顺序。 - gnud
1
是我自己的问题还是你的例子中POST应该在GET之后,因此变量的内容被覆盖了?不确定,所以我在问... - Franz

2
经常提到的$_REQUEST不安全性是虚假的。这些都是从用户获取数据的方式,这个用户可能使用的是不安全的机器。您必须始终对输入进行消毒,因此使用其中任何一种都没有真正的安全优势。只有在不同渠道上具有相同名称的值具有不同用途时,才具有重要意义。在这种情况下,您应该重新命名其中一些。

非常正确,人们想要大喊请求是一个巨大的安全漏洞,但是即使GET和POST同样不安全,很容易在它们中插入淘气的部分,您需要始终对所有数据进行消毒,即使是来自您的数据库的内容。 - TravisO

2

HTTP GET的语义意味着用于获取页面,而POST可以被认为是在使用时,你期望某种状态会发生改变。

例如,使用相同参数多次进行GET操作应产生相同的结果,而使用POST则可能不会。

如果不在应该使用POST的情况下使用它,将会导致问题。我认为Ruby on Rails AJAX库使用GET而不是POST,当被网络爬虫访问时,导致了大量数据的丢失。

因此,您应该避免使用$_REQUEST。您应该知道页面的目的,并决定如何回答GET请求和POST请求。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接