PHP防sql注入

來源:互聯網
上載者:User

標籤:

1.首先將magic_quotes_gpc設定為On,display_errors設定為Off.
2.項目正式上線後,調用 mysql_query 等 mysql 函數時,前面應該加上 @,即 @mysql_query(...)  ,這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的資訊。
3.在php.ini裡把register_globals = On該成register_globals = Off, 這點的好處就是讓你php中的變數不能直接從get/post等地方擷取,而是由你自己程式上擷取
4.安全參數擷取函數:
<?php
    define("XH_PARAM_INT",0);
    define("XH_PARAM_TXT",1);
    function PAPI_GetSafeParam($pi_strName, $pi_Def = "", $pi_iType = XH_PARAM_TXT)
    {
      if ( isset($_GET[$pi_strName]) )
        $t_Val = trim($_GET[$pi_strName]);
      else if ( isset($_POST[$pi_strName]))
        $t_Val = trim($_POST[$pi_strName]);
      else
        return $pi_Def;
      // INT
      if ( XH_PARAM_INT == $pi_iType)
      {
        if (is_numeric($t_Val))
          return $t_Val;
        else
          return $pi_Def;
      }
      // String
      $t_Val = str_replace("&", "&amp;",$t_Val);
      $t_Val = str_replace("<", "&lt;",$t_Val);
      $t_Val = str_replace(">", "&gt;",$t_Val);
      if ( get_magic_quotes_gpc() )
      {
        $t_Val = str_replace("\\\"", "&quot;",$t_Val);
        $t_Val = str_replace("\\‘‘", "&#039;",$t_Val);
      }
      else
      {
        $t_Val = str_replace("\"", "&quot;",$t_Val);
        $t_Val = str_replace("‘", "&#039;",$t_Val);
      }
      return $t_Val;
    }

在這個函數中,有三個參數:

$pi_strName: 變數名
$pi_Def: 預設值
$pi_iType: 資料類型。取值為 XH_PARAM_INT, XH_PARAM_TXT, 分別表示數值型和文本型。  如果請求是數值型,那麼調用 is_numeric() 判斷是否為數值。如果
不是,則返回程式指定的預設值。簡單起見,對於文本串,我將使用者輸入的所有危險字元(包括HTML代碼),全部轉義。由於 php 函數  addslashes()存在漏
洞,我用 str_replace()直接替換。get_magic_quotes_gpc() 函數是 php  的函數,用來判斷 magic_quotes_gpc 選項是否開啟。

剛才樣本,代碼可以這樣調用:
<?php
if ( isset($_POST["f_login"] ) )
{
  // 串連資料庫...
  // ...代碼略...
 
  // 檢查使用者是否存在
  $t_strUid = PAPI_GetSafeParam("f_uid", 0, XH_PARAM_INT);
  $t_strPwd = PAPI_GetSafeParam("f_pwd", "", XH_PARAM_TXT);
  $t_strSQL = "SELECT * FROM tbl_users WHERE uid=$t_strUid AND password = ‘$t_strPwd‘ LIMIT 0,1";
  if ( $t_hRes = mysql_query($t_strSQL) )
  {
    // 成功查詢之後的處理. 略...
  }
}
?>


1. 防範可以從兩個方面著手,一個就是伺服器,二個就是代碼本身,介紹伺服器配置的文章很多了,無非就是把magic_quotes_gpc設定為On,display_errors設定為Off
2.代碼入手
 1)我們可以通過使用者輸入的使用者名稱去擷取到該使用者名稱在資料庫中的密碼,然後和輸入的密碼進行比對,如果相同則說明輸入的密碼是正確的,否則有問題
 2)更好的方式是使用pdo的PDO::prepare()  預先處理操作來防止sql注入漏洞PDO::prepare()主要是預先處理操作,需要通過$rs->execute()來執行預先處理裡面的SQL語句,
   這個方法可以綁定參數,功能比較強大 。綁定參數有兩種方式: 通過名字綁定,或者是通過?號來綁定均可.
3.搜尋引擎中sql注入問題過濾%和_防止所有的資料被查詢出來.

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.