php防範sql注入方法與執行個體代碼

來源:互聯網
上載者:User

php防範sql注入是一個非常重要的安全手段。

一個優秀的php程式員除了要能順利的編寫代碼,還需要具備使程式處於安全環境下的能力。今天我們要向大家講解的是有關php防範sql注入的相關方法。說到網站安全就不得不提到sql注入(sql injection),如果你用過asp,對sql注入一定有比較深的理解,php的安全性相對較高,這是因為mysql4以下的版本不支援子語句,而且當php.ini裡的 magic_quotes_gpc 為on 時。

提交的變數中所有的 ' (單引號), " (雙引號), \ (反斜線) and Null 字元會自動轉為含有反斜線的逸出字元,給sql注入帶來不少的麻煩。請看清楚:“麻煩”而已~這並不意味著php防範sql注入,書中就講到了利用改變注入語句的編碼來繞過轉義的方法,比如將sql語句轉成ascii編碼(類似:char(100,58,92,108,111,99,97,108,104,111,115,116…)這樣的格式),或者轉成16進位編碼,甚至還有其他形式的編碼,這樣以來,轉義過濾便被繞過去了,那麼怎樣防範呢:

a. 開啟magic_quotes_gpc或使用addslashes()函數在新版本的php中,就算magic_quotes_gpc開啟了,再使用addslashes()函數,也不會有衝突,但是為了更好的實現版本相容,建議在使用轉移函數前先檢測magic_quotes_gpc狀態,或者直接關掉,代碼如下:php防範sql注入的代碼

  1. // 去除逸出字元
  2. function stripslashes_array($array) {
  3. if (is_array($array)) {
  4. foreach ($array as $k => $v) {
  5. $array[$k] = stripslashes_array($v);
  6. }
  7. } else if (is_string($array)) {
  8. $array = stripslashes($array);
  9. }
  10. return $array;
  11. }
  12. @set_magic_quotes_runtime(0);
  13. // 判斷 magic_quotes_gpc 狀態
  14. if (@get_magic_quotes_gpc()) {
  15. $_get = stripslashes_array($_get);
  16. $_post = stripslashes_array($_post);
  17. $_cookie = stripslashes_array($_cookie);
  18. }
複製代碼

去除magic_quotes_gpc的轉義之後再使用addslashes函數,代碼如下:php防範sql注入的代碼

  1. $keywords = addslashes($keywords);
  2. $keywords = str_replace("_","\_",$keywords);//轉義掉”_”
  3. $keywords = str_replace("%","\%",$keywords);//轉義掉”%”
複製代碼

後兩個str_replace替換轉義目的是防止駭客轉換sql編碼進行攻擊。

b. 強制字元格式設定(類型)在很多時候我們要用到類似xxx.php?id=xxx這樣的url,一般來說$id都是整型變數,為了防範攻擊者把$id篡改成攻擊語句,我們要盡量強制變數,代碼如下:php防範sql注入的代碼$id=intval($_get['id']);當然,還有其他的變數類型,如果有必要的話盡量強制一下格式。

c. sql語句中包含變數加引號這一點兒很簡單,但也容易養成習慣,先來看看這兩條sql語句:

  1. select * from article where articleid='$id'
  2. select * from article where articleid=$id
複製代碼

兩種寫法在各種程式中都很普遍,但安全性是不同的,第一句由於把變數$id放在一對單引號中,這樣使得我們所提交的變數都變成了字串,即使包含了正確的sql語句,也不會正常執行,而第二句不同,由於沒有把變數放進單引號中,那我們所提交的一切,只要包含空格,那空格後的變數都會作為sql語句執行,因此,我們要養成給sql語句中變數加引號的習慣。

d.url偽靜態化url偽靜態化也就是url重寫技術,像discuz!一樣,將所有的url都rewrite成類似xxx-xxx-x.html格式,既有利於seo,又達到了一定的安全性,也不失為一個好辦法。但要想實現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.