日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
PHP編碼安全:變量安全

變量覆蓋常常被惡意攻擊者用來跳過正常的業(yè)務邏輯,越過權限限制,惡意攻擊系統(tǒng),嚴重時將造成系統(tǒng)癱瘓。

成都創(chuàng)新互聯是一家朝氣蓬勃的網站建設公司。公司專注于為企業(yè)提供信息化建設解決方案。從事網站開發(fā),網站制作,網站設計,網站模板,微信公眾號開發(fā),軟件開發(fā),小程序制作,10余年建站對成都自拌料攪拌車等多個方面,擁有多年的網站制作經驗。

1、全局變量覆蓋

當register_globals全局變量設置開啟時,傳遞過來的值會被直接注冊為全局變量而直接使用,這會造成全局變量覆蓋。

如果通過$GLOBALS從瀏覽器動態(tài)獲取變量,也會發(fā)生變量覆蓋的情況。為了方便理解,引用全局變量配置的例子進行介紹。

 
 
 
  1.   
  2.   
  3.   
  4.   
  5.  

通過$GLOBALS獲取瀏覽器提交的變量。

 
 
 
  1. foreach($_REQUEST as $param=>$value) {  
  2. $GLOBALS[$param]=>$value; // 使用$GLOBALS造成變量覆蓋  
  3. }  
  4. if(authenticated_user()) { // 認證用戶是否登錄  
  5. $authorized=true;  

攻擊者在請求中構造authorized=true,無須認證用戶名和密碼就可以直接設置authorized的值為true,從而跳過認證進入登錄狀態(tài)。

為了避免全局變量覆蓋的發(fā)生,研發(fā)人員不應該使用上面的方式從客戶端接收動態(tài)變量將其放入全局的$GLOBALS中。以下是修復后的代碼。

 
 
 
  1. $username=$_POST['username'];  
  2. $password=$_POST['password'];  
  3. if(authenticated_user($username,$password)) { // 認證用戶是否登錄  
  4. $authorized=true;  

2、動態(tài)變量覆蓋

PHP動態(tài)變量是指一個變量的變量名可以動態(tài)地設置和使用,一個變量獲取另一個變量的值作為這個變量的變量名。以下是動態(tài)變量示例。

 
 
 
  1. $Bar="a";  
  2. $Foo="Bar";  
  3. $World="Foo"; 
  4. $Hello="World";  
  5. $a="Hello";  
  6. echo $a; // 輸出Hello  
  7. echo $$a; // 輸出World  
  8. echo $$$a; // 輸出Foo  
  9. echo $$$$a; // 輸出Bar 
  10. echo $$$$$a; // 輸出a  
  11. echo $$$$$$a; // 輸出Hello  
  12. echo $$$$$$$a; // 輸出World 

研發(fā)人員在平時研發(fā)過程中多多少少會使用一些動態(tài)變量,然而使用不當將會造成變量覆蓋,所以應該盡量避免使用PHP的動態(tài)變量。

以下代碼示例中的動態(tài)變量就屬于使用不當的情況。

 
 
 
  1. foreach($_POST as $key=>$value) {  
  2. $$key=$value; // 造成動態(tài)變量覆蓋  
  3. }  
  4. if(authenticated_user()) { // 認證用戶是否登錄  
  5. $authorized=true;  
  6. }  
  7. ?> 

當用戶提交的參數中包含authorized=true時,在執(zhí)行authenticated_user()步驟之前,authorized的值已經被設置為true,因此用戶在無須通過校驗的情況下即可直接向下執(zhí)行,繞過了校驗邏輯,造成任意越權訪問的后果。

為了避免全局變量覆蓋的發(fā)生,應盡量不使用動態(tài)變量接收客戶端參數。以下是修復后的代碼。

 
 
 
  1. $username=$_POST['username'];  
  2. $password=$_POST['password'];  
  3. if(authenticated_user($username,$password)) { // 認證用戶是否登錄  
  4. $authorized=true;  

3、函數extract()變量覆蓋

extract()函數的作用是從數組中導入變量到當前符號表中,檢查每個鍵是否是有效的變量名。它還檢查與符號表中現有變量是否沖突。為了防止發(fā)生變量覆蓋,在使用的時候需要將flags設置為EXTR_SKIP,以免將已有變量覆蓋。

 
 
 
  1. extract($_REQUEST ); // 使用extract造成變量覆蓋  
  2. if(authenticated_user()) { // 認證用戶是否登錄  
  3. $authorized=true;  
  4. }  
  5. ?> 

當用戶提交的參數中包含authorized=true時,在執(zhí)行authenticated_user()步驟之前,extract()函數從$_REQUEST中解析到authorized并設置全局變量,它的值被設置為true。此時,用戶在無須通過校驗的情況下可直接向下執(zhí)行,繞過了校驗邏輯,造成任意越權訪問。

為了避免全局變量覆蓋的發(fā)生,應盡量不使用extract()函數接收客戶端參數。下面是修復后的代碼。

 
 
 
  1. $username=$_POST['username'];  
  2. $password=$_POST['password'];  
  3. if(authenticated_user($username,$password)) { // 認證用戶是否登錄  
  4. $authorized=true;  

4、函數import_request_variables()變量覆蓋

import_request_variables()函數的作用是導入GET/POST/Cookie變量進入全局范圍。如果在PHP配置中禁用了register_globals,但是又希望導入一些全局變量,可能會用到import_request_variables()函數。

 
 
 
  1. import_request_variables("gp"); // 導入GET和POST中的變量造成變量覆蓋  
  2. if(authenticated_user()) { // 認證用戶是否登錄  
  3. $authorized=true;  
  4. }  
  5. ?> 

當用戶提交的參數中包含authorized=true時,在執(zhí)行authenticated_user()步驟之前,import_request_variables解析GET或POST中包含的authorized參數,并且設置為true。此時,用戶在無須通過校驗的情況下可直接向下執(zhí)行,繞過了校驗邏輯,造成任意越權訪問。

為了避免全局變量覆蓋的發(fā)生,應盡量不使用上述方式接收客戶端參數。以下是修復后的代碼。

 
 
 
  1. $username=$_POST['username'];  
  2. $password=$_POST['password'];  
  3. if(authenticated_user($username,$password)) { // 認證用戶是否登錄  
  4. $authorized=true;  

5、函數parse_str()變量覆蓋

parse_str()函數用于解析客戶端以x-www-form-urlencoded編碼格式的字符串到PHP變量中。該函數有指定輸出變量和不指定輸出變量兩種使用方式。

以下示例是parse_str()的兩種使用方式。

 
 
 
  1. $str="first=value&arr[]=foo+bar&arr[]=baz";  
  2. // 第一種:當指定輸出變量時  
  3. parse_str($str,$output);  
  4. echo $output['first']; // value  
  5. echo $output['arr'][0]; // foo bar  
  6. echo $output['arr'][1]; // baz  
  7. // 第一種:當不指定輸出變量時  
  8. parse_str($str);  
  9. echo $first; // value  
  10. echo $arr[0]; // foo bar  
  11. echo $arr[1]; // baz  
  12. ?> 

在不指定輸出變量的情況下,極易出現變量覆蓋,影響正常業(yè)務邏輯,例如以下形式。

 
 
 
  1. parse_str($GLOBALS['HTTP_RAW_POST_DATA']); //獲取POST中的變量造成變量覆蓋  
  2. if(authenticated_user()) { // 認證用戶是否登錄  
  3. $authorized=true;  
  4. }  
  5. ?> 

當用戶在提交的參數中直接提交authorized=true時,parse_str()函數通過解析POST中的authorized并且將值設置為true。此時,無須執(zhí)行if條件內部語句即可將authorized的值設置為true,就跳過了用戶驗證邏輯,造成任意登錄。

為了避免全局變量覆蓋的發(fā)生,應盡量使用指定輸出變量的方式。以下是修復后的代碼。

 
 
 
  1. parse_str($_POST,$output);  
  2. if(authenticated_user($output['username'],$output['password'])) { // 認證用戶是否登錄  
  3. $authorized=true;  
  4. }  

當前題目:PHP編碼安全:變量安全
URL地址:http://www.dlmjj.cn/article/dpposjo.html