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

时间:2008-12-15 13:16:18

标签: php security

$_REQUEST从Cookie中读取内容外,我还有任何理由使用$_GET$_POST代替$_REQUEST吗?这样做的理论和实践原因是什么?

7 个答案:

答案 0 :(得分:8)

  

除了$ _REQUEST从cookie中读取

之外

除了这是未定义的事实(它可以在每个安装级别配置),使用$_REQUEST的问题是它过度简化了事情。 GET请求和POST请求之间存在(或应该)语义差异。因此,如果您从一个源或另一个源获得输入,那么它对您的应用程序很重要。这就是HTTP协议的定义方式,因此通过忽略它,您正在破坏协议,这使您的应用程序可以减少互操作性。它与使用语义HTML标记而不是面向表示的标记可以是相同的类型参数。或者更一般地说,遵循协议的意图而不是仅仅在具体情况下做任何工作。

答案 1 :(得分:8)

当我只是希望用户的某些数据返回某些数据时,我使用$ _REQUEST。

当请求有副作用时,切勿使用$ _REQUEST。产生副作用的请求应该是POST(出于语义原因,并且由于基本的CSRF原因,错误的img标记可以在没有用户知道的情况下命中任何GET端点。)

当对页面进行GET或POST会产生不同的结果时,应该使用

$ _ GET。

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

$ _REQUEST的使用会向你的应用程序打开一些攻击向量,在这些向量中你可能会覆盖变量而不希望它发生。

还要考虑$ _REQUEST将被填充的订单GPC(Get,Post,Cookie)。

即。请求:

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

将导致

<强> $_REQUEST['foo'] == 'bar'

答案 4 :(得分:2)

经常提到$ _REQUEST的不安全感是假的。所有这些都是从具有非安全机器的用户获取数据的方法。你总是需要对输入进行消毒,因此使用任何一个都没有真正的安全优势。

如果您对不同渠道上具有相同名称的值有不同的用途,那么它才有意义。在这种情况下,你应该重命名其中一些。

答案 5 :(得分:2)

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

例如,期望多次使用具有相同参数的GET产生相同的结果,而使用POST时,它们可能不会。

当你遇到问题时不使用POST。我认为Ruby on Rails AJAX库使用GET而不是POST,并且当被Web蜘蛛触及时会导致大量数据丢失。

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

答案 6 :(得分:0)

这是我刚发现的一个: When and why should $_REQUEST be used instead of $_GET / $_POST / $_COOKIE?。 对不起,我没有早点找到,所以我不会问这个问题......