1. 程式人生 > >登入測試——SQL注入

登入測試——SQL注入

登入頁面的安全性測試包含一項:防止SQL注入

什麼是SQL注入

SQL Injection:就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。

例如:
填好正確的使用者名稱(marcofly)和密碼(test)後,點選提交,將會返回給我們“歡迎管理員”的介面。

select * from users where username=‘marcofly’ and password=md5(‘test’)

很明顯,使用者名稱和密碼都和我們之前給出的一樣,肯定能夠成功登陸。但是,如果我們輸入一個錯誤的使用者名稱或密碼呢?很明顯,肯定登入不了吧。恩,正常情況下是如此,但是對於有SQL注入漏洞的網站來說,只要構造個特殊的“字串”,照樣能夠成功登入。

比如:在使用者名稱輸入框中輸入:’ or 1=1#,密碼隨便輸入,這時候的合成後的SQL查詢語句為:

select * from users where username=’’ or 1=1#’ and password=md5(’’)

語義分析:“#”在mysql中是註釋符,這樣井號後面的內容將被mysql視為註釋內容,這樣就不會去執行了,換句話說,以下的兩句sql語句等價:

select * from users where username=’’ or 1=1#’ and password=md5(’’)

等價於

select * from users where username=’’ or 1=1

SQL注入採用的’ OR 1=1 # 是什麼意思呢?

最後一個#號有什麼意義呢?
SELECT * FROM test WHERE name=’’ OR 1=1 #’ AND age=‘20’
這後面寫的 #’ 是什麼意思呢? 求指教
.# 可以註釋掉後面的一行SQL程式碼

相當於去掉了一個where條件

MySQL 註釋, 過濾掉後面的SQL語句,使其不起作用

因為1=1永遠是都是成立的,即where子句總是為真,將該sql進一步簡化之後,等價於如下select語句:

select * from users 沒錯,該sql語句的作用是檢索users表中的所有欄位

小技巧:一個經構造後的sql語句竟有如此可怕的破壞力,相信你看到這後,開始對sql注入有了一個理性的認識了吧~

有漏洞的指令碼才有機會給你攻擊,比如一個帶引數的刪除指令碼a.asp?action=del&id=2你可以改為a.asp?action=del&id=2 or 1這樣就有可能刪除全部資料------sql注入就是通過類似的手段來破壞資料

防止SQL注入的辦法

SQL預處理語句(Prepared Statements)
為什麼預處理能預防SQL注入,提高安全性呢?
其實是因為SQL語句在程式執行前已經進行了預編譯,在程式執行時第一次操作資料庫之前,SQL語句已經被資料庫分析,編譯和優化,對應的執行計劃也會快取下來並允許資料庫已引數化的形式進行查詢,當執行時動態地把引數傳給PreprareStatement時,即使引數裡有敏感字元如 or '1=1’也資料庫會作為一個引數一個欄位的屬性值來處理而不會作為一個SQL指令,如此,就起到了SQL注入的作用。