php安全編程—sql注入攻擊

來源:互聯網
上載者:User

標籤:

原文:php安全編程—sql注入攻擊

php安全編程——sql注入攻擊定義

  1. SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL文法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。
  2. 根據相關技術原理,SQL注入可以分為平台層注入和代碼層注入。前者由不安全的資料庫配置或資料庫平台的漏洞所致;後者主要是由於程式員對輸入未進行細緻地過濾,從而執行了非法的資料查詢。基於此,SQL注入的產生原因通常表現在以下幾方面:

    • 不當的類型處理;
    • 不安全的資料庫配置;
    • 不合理的查詢集處理;
    • 不當的錯誤處理;
    • 逸出字元處理不合適;
    • 多個提交處理不當。
  3. 在某些表單中,使用者輸入的內容直接用來構造動態sql命令,或者作為預存程序的輸入參數,這些表單特別容易受到sql注入的攻擊。而許多網站程式在編寫時,沒有對使用者輸入的合法性進行判斷或者程式中本身的變數處理不當,使應用程式存在安全隱患。這樣,使用者就可以提交一段資料庫查詢的代碼,根據程式返回的結果,獲得一些敏感的資訊或者控制整個伺服器,於是sql注入就發生了

常用技術
  1. 強制產生錯誤
    對資料庫類型、版本等資訊進行識別是此類型攻擊的動機所在。它的目的是收集資料庫的類型、結構等資訊為其他類型的攻擊做準備,可謂是攻擊的一個預備步驟。利用應用程式伺服器返回的預設錯誤資訊而取得漏洞資訊。
  2. 採用非主流通道技術
    除HTTP響應外,能通過通道擷取資料,然而,通道大都依賴與資料庫支援的功能而存在,所以這項技術不完全適用於所有的資料庫平台。SQL注入的非主流通道主要有E-mail、DNS以及資料庫連接,基本思想為:先對SQL查詢打包,然後藉助非主流通道將資訊反饋至攻擊者。
  3. 使用特殊的字元
    不同的SQL資料庫有許多不同是特殊字元和變數,通過某些配置不安全或過濾不細緻的應用系統能夠取得某些有用的資訊,從而對進一步攻擊提供方向。
  4. 使用條件陳述式
    此方式具體可分為基於內容、基於時間、基於錯誤三種形式。一般在經過常規訪問後加上條件陳述式,根據資訊反饋來判定被攻擊的目標
  5. 利用預存程序
    通過某些標準預存程序,資料庫廠商對資料庫的功能進行擴充的同時,系統也可與進行互動。部分預存程序可以讓使用者自行定義。通過其他類型的攻擊收集到資料庫的類型、結構等資訊後,便能夠建構執行預存程序的命令。這種攻擊類型往往能達到遠程命令執行、特權擴張、拒絕服務的目的。
  6. 避開輸入過濾技術
    雖然對於通常的編碼都可利用某些過濾技術進行SQL注入防範,但是鑒於此種情況下也有許多方法避開過濾,一般可達到此目的的技術手段包括SQL注釋和動態查詢的使用,利用截斷,URL編碼與空位元組的使用,大小寫變種的使用以及嵌套剝離後的運算式等等。藉助於此些手段,輸入構思後的查詢可以避開輸入過濾,從而攻擊者能獲得想要的查詢結果。
  7. 推斷技術
    能夠明確資料庫模式、提取資料以及識別可注入參數。此種方式的攻擊通過網站對使用者輸入的反饋資訊,對可注入參數、資料庫模式推斷,這種攻擊構造的查詢執行後獲得的答案只有真、假兩種。基於推斷的注入方式主要分為時間測定注入與盲注入兩種。前者是在注入語句裡加入語句諸如“waitfor 100”,按照此查詢結果出現的時間對注入能否成功和資料值範圍的推導進行判定;後者主要是“and l=l”、“and l=2”兩種經典注入方法。這些方式均是對一些間接關聯且能取得回應的問題進行提問,進而通過響應資訊推斷出想要資訊,然後進行攻擊
防範方法
  1. 強制字元格式設定(類型)

    • 對於整形變數, 運用 intval函數將資料轉換成整數
    • 浮點型參數:運用 floatval或doubleval函數分別轉換單精確度和雙精確度浮點型參數
    • 字元型參數:運用 addslashes函數來將單引號“’”轉換成“\’”,雙引號“"”轉換成“"”,反斜線“\”轉換成“\”,NULL字元加上反斜線“\”如果是字元型,先判斷magic_quotes_gpc是否為On,當不為On的時候運用 addslashes轉義特殊字元
  2. 生產環境關閉資料庫錯誤提示,以避免攻擊者得到資料庫的相關資訊。
  3. SQL語句中包含變數加引號
    SELECT * FROM article WHERE articleid=‘$id‘
    沒有把變數放進單引號中,那我們所提交的一切,只要包含空格,那空格後的變數都會作為SQL語句執行,給了攻擊者構造特殊sql語句的可能。因此,我們要養成給SQL語句中變數加引號的習慣
  4. 使用pdo 使用 prepared statements ( 預先處理語句 )和參數化的查詢。這些SQL語句被發送到資料庫伺服器,它的參數全都會被單獨解析。使用這種方式,攻擊者想注入惡意的SQL是不可能的

    • 使用PDO訪問MySQL資料庫時,真正的real prepared statements 預設情況下是不使用的。為瞭解決這個問題,你必須禁用 prepared statements的模擬效果。下面是使用PDO建立連結的例子:

      <?php  $dbh = new PDO('mysql:dbname=mydb;host=127.0.0.1;charset=utf8', 'root', 'pass');  $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);  ?>  

      這可以確保SQL語句和相應的值在傳遞到mysql伺服器之前是不會被PHP解析的(禁止了所有可能的惡意SQL注入攻擊)

    完整範例程式碼:

        <?php      $dbh = new PDO("mysql:host=localhost; dbname=mydb", "root", "pass");      $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的模擬效果      $dbh->exec("set names 'utf8'");       $sql="select * from table where username = ? and password = ?";      $query = $dbh->prepare($sql);       $exeres = $query->execute(array($username, $pass));       if ($exeres) {           while ($row = $query->fetch(PDO::FETCH_ASSOC)) {              print_r($row);          }      }      $dbh = null;      ?>  
    當調用 prepare() 時,查詢語句已經發送給了資料庫伺服器,此時只有預留位置 ? 發送過去,沒有使用者提交的資料;當調用到 execute()時,使用者提交過來的值才會傳送給資料庫,它們是分開傳送的,兩者獨立的,SQL攻擊者沒有一點機會。
  5. 如下幾種情況,pdo prepared statements 將不能起到防範的作用

    • PDO::ATTR_EMULATE_PREPARES 啟用或禁用預先處理語句的類比。 有些驅動不支援或有限度地支援本地預先處理。使用此設定強制PDO總是類比預先處理語句(如果為 TRUE ),或試著使用本地預先處理語句(如果為 FALSE)。如果驅動不能成功預先處理當前查詢,它將總是回到類比預先處理語句上。
    • 不能讓預留位置 ? 代替一組值,這樣只會擷取到這組資料的第一個值,
      select * from table where userid in ( ? );
      如果要用in來尋找,可以改用find_in_set()實現:
      $ids = ‘1,2,3,4,5,6‘; select * from table where find_in_set(userid, ?);
    • 不能讓預留位置代替資料表名或列名,如:
      select * from table order by ?;
    • 不能讓預留位置 ? 代替任何其他SQL文法,如:
      select extract( ? from addtime) as mytime from table;

php安全編程—sql注入攻擊

相關文章

聯繫我們

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