2008-12-15 128 views
8

除了从Cookie中读取$_REQUEST的事实,是否有任何理由为什么我应该使用$_GET$_POST而不是$_REQUEST?这样做的理论和实践原因是什么?

回答

8

我使用$ _REQUEST时,我只是想从用户的某些数据返回某些数据。

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

$ _GET应该用于GET或发布到页面时会产生不同的结果。

4

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

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

即一个请求:

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

将导致

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

+0

请注意,你可以改变什么顺序请求变量填充在,如果你控制的php.ini – gnud 2008-12-15 13:24:15

+1

难道只是我还是会后跟从得到你的榜样,因此变量的内容被改写?不知道,这就是为什么我问... – Franz 2009-12-17 22:17:29

5

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

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

+0

优秀的答案!我希望看到更多这些。 – Tom 2008-12-15 13:54:52

2

$ _REQUEST经常提到的不安全性是虚假的。所有这些都是从用户那里获取数据的方法,该用户拥有非安全机器。你总是必须清理输入,所以使用任何一个都没有真正的安全优势。

只有当您在不同渠道上具有相同名称的值有不同用途时,它才有意义。在这种情况下,你应该重新命名一些。

+0

非常真实,让人想尖叫该请求是一些大的安全漏洞,但即使是GET和POST也同样不安全,很容易调皮位插放进去,你需要经常消毒的所有数据,即使是来自于你的数据库的东西。 – TravisO 2008-12-15 17:00:10

8

除了这个事实,$ _REQUEST从饼干

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

2

HTTP GET在语义意味着被用来获取一个网页,而POST可以说,在使用时,你会想到的是某种状态的改变。

例如,有一种期望,使用与所述相同的参数多次产生相同的结果得到的,在使用POST,他们可能没有。

不使用POST时,你应该屈服于问题。我认为Ruby on Rails AJAX库使用GET而不是POST,并且导致大量数据在被网络蜘蛛所触及时丢失。

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

相关问题