<track id="1rt7t"></track>
<pre id="1rt7t"></pre>

    <p id="1rt7t"><ruby id="1rt7t"><b id="1rt7t"></b></ruby></p>

      軟件培訓網

      歡迎訪問軟件培訓網!招生咨詢電話與微信:15225191462(周老師)
      軟件培訓網,專業解決學IT疑難雜癥!

      首頁 > php技術/ 正文

      PHP如何避免SQL注入攻擊

      2014-01-19 16:48:40 軟件培訓網

        SQL 注入攻擊 的主要原因,是因為以下兩點原因:sit軟件培訓網

      1. php 配置文件 php.ini 中的   magic_quotes_gpc 選項沒有打開,被置為 off;
      2. 開發者沒有對 數據類型 進行 檢查和轉義。
      不過事實上,第二點最為重要。我認為,   對用戶輸入的數據類型進行檢查,向 MYSQL 提交正確的數據類型,這應該是一個 web 程序員最最基本的素質 。但現實中,常常有許多小白式的 Web 開發者忘了這點,從而導致后門大開。
      為什么說第二點最為重要?因為如果沒有第二點的保證,magic_quotes_gpc 選項,不論為 on,還是為 off,都有可能引發 SQL 注入攻擊。下面來看一下技術實現:
      一、 magic_quotes_gpc = Off 時的注入攻擊
      magic_quotes_gpc = Off   是 php 中一種非常不安全的選項。新版本的 php 已經將默認的值改為了 On。但仍有相當多的服務器的選項為 off。畢竟,再古董的服務器也是有人用的。
      當magic_quotes_gpc = On 時,它會將提交的變量中所有的 '(單引號)、"(雙號號)、(反斜線)、空白字符,都會在前面自動加上 。下面是 PHP的官方說明:
       magic_quotes_gpc   boolean 
      如果沒有轉義,即 off 情況下,就會讓攻擊者有機可乘。以下列測試腳本為例:
      01 <?
      02 if   (isset($_POST["f_login"])) {
      03   // 連接數據庫...
      04   // ...代碼略...
      05
      06   // 檢查用戶是否存在
      07   $t_strUname = $_POST["f_uname"];
      08   $t_strPwd = $_POST["f_pwd"];
      09   $ t_strSQL   = "SELECT * FROM tbl_users WHERE username='$t_strUname' AND password = '$t_strPwd' LIMIT 0,1";
      10
      11   if ($ t_hRes   =  mysql_query ($t_strSQL)) {
      12     // 成功查詢之后的處理. 略...
      13   }
      14 }
      15 ?>
      16 < html >< head >< title >sample test</ title ></ head >
      17 < body >
      18 < form   method = "post"   action = "" >
      19   Username: < input   type = "text"   name = "f_uname"  size = 30 >< br >
      20   Password: < input   type = text   name = "f_pwd"   size =30 >< br >
      21
      22   < input   type = "submit"   name = "f_login"   value ="登錄" >
      23 </ form >
      24 </ body >
      在這個腳本中,當用戶輸入正常的用戶名和密碼,假設值分別為 zhang3、abc123,則提交的 SQL 語句如下:
      1 SELECT   *  FROM   tbl_users
      2 WHERE   username= 'zhang3'   AND   password   =  'abc123'  LIMIT 0,1
      如果攻擊者在 username 字段中輸入:zhang3' OR 1=1 #,在 password 輸入 abc123,則提交的 SQL 語句變成如下:
      1 SELECT   *  FROM   tbl_users
      2 WHERE   username= 'zhang3'   OR   1=1 # ' AND password = 'abc123' LIMIT 0,1
      由于 # 是 mysql中的注釋符, #之后的語句不被執行,實現上這行語句就成了:
      1 SELECT   *  FROM   tbl_users
      2 WHERE   username= 'zhang3'   OR   1=1
      這樣攻擊者就可以繞過認證了。如果攻擊者知道數據庫結構,那么它構建一個 UNION SELECT,那就更危險了:
      假設在 username 中輸入:zhang3 ' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #
      在password 輸入: abc123,
      則提交的 SQL 語句變成:
      1 SELECT   *  FROM   tbl_users
      2 WHERE   username= 'zhang3 '
      3 OR   1 =1  UNION   select   cola, colb,cold  FROM   tbl_b #' AND password = ' abc123' LIMIT 0,1
      這樣就相當危險了。如果agic_quotes_gpc選項為 on,引號被轉義,則上面攻擊者構建的攻擊語句就會變成這樣,從而無法達到其目的:
      1 SELECT   *  FROM   tbl_users
      2 WHERE   username= 'zhang3'   OR   1=1 # '
      3 AND password = ' abc123 '
      4 LIMIT 0,1
      5
      6 SELECT * FROM tbl_users
      7 WHERE username=' zhang3 ' OR 1 =1 UNION select cola, colb,cold FROM tbl_b #'
      8 AND   password   =  'abc123'   LIMIT 0,1
      二、magic_quotes_gpc = On 時的注入攻擊
      當 magic_quotes_gpc = On 時,攻擊者無法對字符型的字段進行 SQL 注入。這并不代表這就安全了。這時,可以通過數值型的字段進行SQL注入。
      在最新版的 MYSQL 5.x 中,已經嚴格了數據類型的輸入,已默認關閉自動類型轉換。數值型的字段,不能是引號標記的字符型。也就是說,假設 uid 是數值型的,在以前的 mysql 版本中,這樣的語句是合法的:
      1 INSERT   INTO   tbl_user  SET   uid= "1" ;
      2 SELECT   *  FROM   tbl_user  WHERE   uid= "1" ;
      在最新的 MYSQL 5.x 中,上面的語句不是合法的,必須寫成這樣:
      1 INSERT   INTO   tbl_user  SET   uid=1;
      2 SELECT   *  FROM   tbl_user  WHERE   uid=1;
      這樣我認為是正確的。因為作為開發者,向數據庫提交正確的符合規則的數據類型,這是最基本的要求。
      那么攻擊者在 magic_quotes_gpc = On 時,他們怎么攻擊呢?很簡單,就是對數值型的字段進行 SQL 注入。以下列的 php 腳本為例:
      01 <?
      02 if   (isset($_POST["f_login"])) {
      03   // 連接數據庫...
      04   // ...代碼略...
      05
      06   // 檢查用戶是否存在
      07   $t_strUid = $_POST["f_uid"];
      08   $t_strPwd = $_POST["f_pwd"];
      09   $ t_strSQL   = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = '$t_strPwd' LIMIT 0,1";
      10   if ($ t_hRes   =  mysql_query ($t_strSQL)) {
      11     // 成功查詢之后的處理. 略...
      12   }
      13 }
      14 ?>
      15 < html >< head >< title >sample test</ title ></ head >
      16 < body >
      17 < form   method = "post"   action = "" >
      18   User ID: < input   type = "text"   name = "f_uid"   size= 30 >< br >
      19   Password: < input   type = text   name = "f_pwd"   size =30 >< br >
      20   < input   type = "submit"   name = "f_login"   value ="登錄" >
      21 </ form >
      22 </ body >
      23 </ html >
      sit軟件培訓網
        

      Tags:信息系統管理工程師,3g軟件工程師技術培訓,安卓培訓機構,鄭州java培訓,android 零基礎培訓,android開發培訓

      搜索
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      熱門標簽
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      軟件培訓學校哪家好,就來軟件培訓網咨詢
      • QQ交談
      制服丝袜无码中文字幕第1页

      <track id="1rt7t"></track>
      <pre id="1rt7t"></pre>

        <p id="1rt7t"><ruby id="1rt7t"><b id="1rt7t"></b></ruby></p>