標籤:資訊 name 很多 ouya dsl 方法 業務 log prot
在寫登入註冊的時候發現了SQL和JS注入這個危害網站的使用者舉動:
測試方法:
SQL注入:
1 先來做一個測試:2 使用者名稱:’ or 1 #3 密碼:隨便寫8位以上4 驗證碼:寫正確
好吧,就那麼簡單就進去了:
概念
如果使用者在填寫表單或者其他資料的時候,通過一些特殊的資料形式,對SQL的行為作出了非法的影響,就叫作SQL注入!
基本原理
正常執行的sql語句:
1 select * from bg_admin where admin_name=‘zhouyang‘ and admin_pass=md5(‘12345678‘)
不正常執行的sql語句:
1 select * from bg_admin where admin_name=‘‘ or 1 #‘ and admin_pass=md5(‘123654uiykgjfhdsav‘)
拆分分析:
由於#在sql語句中是注釋符,所以,上面的SQL語句真正執行的是:
1 select * from bg_admin where admin_name=‘‘ or 1
很顯然,上面執行的結果就是where後面的條件永遠為真!其實就相當於:
1 select * from bg_admin
也就是說,只要bg_admin表中有正常的系統管理使用者,就可以查詢到資料!
其實,在這裡可以進行sql注入的“使用者名稱”還有很多,比如:
‘ or 1 or ‘
1 select * from bg_admin where admin_name=‘‘ or 1 or ‘‘ and admin_pass=md5(‘ewsdfgbnvb‘)
特彆強調:
1, 不僅僅是在使用者登入的時候,SQL語句可以被注入,其他任何使用者的資料只要參與執行,都有可能被注入!
2, SQL注入的危害非常之大,有時候甚至可以刪除伺服器上的整個資料庫:
比如:
使用者名稱為:‘ or 1;drop database php2010;#
注意:
MySQL資料庫預設的有information_schema,所有資料庫的名稱等資訊都存放在裡面,這些資料庫很容易擷取到預設資料庫的名字!
解決方案
1, 在商務邏輯上預防,比如要求使用者名稱只能由特定的字元組成(比如數字字母底線)(使用Regex)
2, 使用PHP函數addslashes(最常用)
其中:
strip_tags(trim($data)是防止JS注入的!!
1 /**2 * 對使用者的資料進行安全過濾3 */4 protected function escapeData($data) {5 return addslashes(strip_tags(trim($data)));6 }
3, 使用MySQL提供的資料轉義函數:mysql_real_escape_string($data, $link);不過有一個前提是必須串連上資料庫之後才可以使用!
4, 使用預先處理技術,因為預先處理是強制將sql語句的結構和資料部分分開!
PHP:測試SQL注入以及防止SQL注入