2008-12-15 131 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請求。

相關問題