程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP $_REQUEST數組安全隱患

PHP $_REQUEST數組安全隱患

編輯:關於PHP編程

大家都知道使用$_REQUEST可以直接省去了判斷post,get一些代碼,使用起來更簡單,但是如果要詳細的去想我們會覺得$_REQUEST太可怕了。下面看分析。

我們都知道,處理表單數據,可以使用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數組獲得

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved