程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php.ini中magic_quote_gpc功能on理解

php.ini中magic_quote_gpc功能on理解

編輯:關於PHP編程

開啟magic_quote_gpc=on之後,能實現addslshes()和stripslashes()這兩個函數的功能。在PHP4.0及以上的版本中,該選項默認情況下是開啟的,所以在PHP4.0及以上的版本中,就算PHP程序中的參數沒有進行過濾,PHP系統也會對每一個通過GET、POST、COOKIE方式傳遞的變量自動轉換,換句話說,輸入的注入攻擊代碼將會全部被轉換,將給攻擊者帶來非常大的困難。

       雖然如此,攻擊者仍然有機會進行SQL注入攻擊。。。。。。前提是,當參數為數字型的時候,且未經過Intval()函數的處理,因為經過intval()的處理之後,所有的數據就都會強制轉換成數字。

       前面已經提到過,開啟magic_quote_gpc=on之後,相當於使用addslshes()這個函數。但是數字型沒有用到單引號,所以理所當然的繞過了addslshes()函數的轉換了。而使用MySQL自帶的char()函數或者HEX(),char()可以將參數解釋為整數並且返回這些整數的ASCII碼字符組成的字符串,使用十六進制表示必須在數字前加上0x。

       實例演示:

       假設我們知道管理員的用戶名為admin,密碼不知道。並且已經將magic_quote_gpc啟用。

       SQL語句:

 代碼如下 復制代碼 $sql="select * from users where username=$name and password='$pwd'";

注意:變量$name沒加引號

       此時,在地址欄中輸入username=admin%23,則合成後的sql語句為:

  

 代碼如下 復制代碼 select * from users where username='admin' #' and password='';

  這時候通過url地址欄輸入的單引號(’)將被加上反斜線,該sql語句將失效。

  admin轉換成ASCII後是char(97,100,109,105,110)

  此時在地址欄中輸入

 代碼如下 復制代碼 username=char(97,100,109,105,110)%23

  SQL語句就變成了:

  

 代碼如下 復制代碼 select * from users where username=char(97,100,109,105,110)#' and password='';

  執行結果為真,就可以順利進入後台。

  對於數字型注入攻擊,必須在任何的數字型參數放入數據庫之前使用intval()對參數進行強制轉換成數字,從而可以斷絕數字型注入漏洞的產生。

  比如:

 代碼如下 復制代碼

$id=intval($_GET[‘id’]);

  select * from articles where id=’$id’;

  地址欄中輸入:

 代碼如下 復制代碼 id=5’ or 1=1%23

  SQL語句將變成:

 代碼如下 復制代碼

select * from articles where id=’5’;

  而不是select * from articles where id=’5’ or 1=1#;

總結:

對於每一個變量都記得加上單引號,比如where username=’$name’,
開啟magic_quote_gpc並不是絕對安全的,對於數字型注入攻擊,僅僅使用addslashes()函數進行轉換是不夠的,還需使用intval()強制將參數轉換成數字

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