PHP $_REQUEST數組安全隱患

來源:互聯網
上載者:User

我們都知道,處理表單資料,可以使用PHP的$_GET和$_POST這兩個超全域變數,具體是哪個由form表單提交時的method指定。除此之外PHP還為我們提供了$_REQUEST數組。但是其不僅包含$_GET和$_POST的所有資料元素,同時其還會包含$_COOKIE這個超全域數組的所有資料元素。
可是大家有沒有想過,如果這三個數組裡面的key相同,那麼我用$_REQUEST得到的到底是哪個數組的值呢?會不會有什麼問題?
我用如下代碼為大家做示範,因為只是想說明問題,所以這裡面不對$_COOKIE進行設定,請大家自行處理:

 代碼如下 複製代碼
<?php
       var_dump($_GET['a'],$_POST['a'],$_REQUEST['a']);
?>
<html>
<head><title>demo</title></head>
<body>
        <form method= 'post' action = 'req.php?a=xxx'>
                <input type='hidden' name='a' value='yyy'/>
                <input type='submit' name='submit' value='submit'/>
        </form>
</body>
</html>

當我提交表單的時候,我擷取的頁面內容為:

string(3) "xxx" string(3) "yyy" string(3) "yyy"

同樣的內容,在$_REQUEST裡面,POST的值覆蓋了GET的值,這到底是怎麼回事呢?
其實這是在PHP的設定檔裡面設定的,讓我們來看一下php.ini這個設定檔,在第466行左右有如下內容:

 代碼如下 複製代碼

; This directive describes the order in which PHP registers GET, POST, Cookie,
; Environment and Built-in variables (G, P, C, E & S respectively, often
; referred to as EGPCS or GPC).  Registration is done from left to right, newer
; values override older values.
variables_order = "EGPCS"

這個EGPCS就是說明用$_REQUEST數組擷取內容的優先順序,其字母的含義分別代表為:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。後面出現的資料會覆蓋前面寫入的資料,其預設的資料寫入方式就是EGPCS,所以POST包含的資料將覆蓋GET中使用相同關鍵字的資料。


$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比較慢。通過post和get方法提交的所有資料都可以通過$_REQUEST數組獲得

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.