淺談開啟magic_quote_gpc後的sql注入攻擊與防範

來源:互聯網
上載者:User

通過啟用php.ini設定檔中的相關選項,就可以將大部分想利用SQL注入漏洞的駭客拒絕於門外。
開啟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()強制將參數轉換成數字
如何防止SQL注入攻擊
方法一:密碼比對
思路:首先通過使用者輸入的使用者名稱去查詢資料庫,得到該使用者名稱在資料庫中對應的密碼,再將從資料庫中查詢到的密碼和使用者提交過來的密碼進行比對。
代碼: 複製代碼 代碼如下:$sql="select password from users where username='$name'";
$res=mysql_query($sql,$conn);
if ($arr=mysql_fetch_assoc($res)){//如果使用者名稱存在
if ($arr['password']==$pwd) {//密碼比對
echo "登入成功";
}else{
echo "密碼輸入有誤";
}
}else {
echo "該使用者名稱不存在";
}

分析:該情況下,代碼健壯了不少,即使在magic_quote_gpc=Off的情況下,也能防止SQL注入攻擊。因為攻擊者想成功登入的話,得繞過兩道坎,第一是輸入的使用者名稱要存在,這一步可以構造一個SQL語句(‘ or 1=1%23)直接繞過,但是這樣子無法通過第二道坎。因為需要使用者輸入一個正確的密碼才能通過,顯然,這已經拒絕了SQL注入攻擊。
方法二:使用PDO的PDO::prepare()預先處理操作來防止SQL注入攻擊
思路:建立一個pdo對象,利用pdo的預先處理操作可以防止SQL注入攻擊
代碼: 複製代碼 代碼如下:$name=$_GET['username'];
$pwd=$_GET['password'];
$sql="select * from users where username=? and password=?";
//1.建立一個pdo對象
$pdo=new PDO("mysql:host=localhost;port=3306;dbname=injection","root","");
//2.設定編碼
$pdo->exec("set names 'utf8'");
//3.預先處理$sql語句
$pdoStatement=$pdo->prepare($sql);
//4.把接收到的使用者名稱和密碼填入
$pdoStatement->execute(array($name,$pwd));
//5.取出結果
$res=$pdoStatement->fetch();
if(empty($res)){
echo "使用者名稱或密碼輸入有誤";
}else{
echo "登入成功";
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.