關於sql注入問題

2021-06-16 10:37:44 字數 2718 閱讀 6415

sql 注入:

1、sql 注入是一種攻擊方式,在這種攻擊方式中,惡意**被插入到字串中,然後將該字串傳遞到 sql server 的例項以進行分析和執行。任何構成 sql 語句的過程都應進行注入漏洞檢查,因為 sql server 將執行其接收到的所有語法有效的查詢。乙個有經驗的、堅定的攻擊者甚至可以操作引數化資料。

2、sql 注入的主要形式包括直接將**插入到與 sql 命令串聯在一起並使其得以執行的使用者輸入變數。一種間接的攻擊會將惡意**注入要在表中儲存或作為元資料儲存的字串。在儲存的字串隨後串連到乙個動態 sql 命令中時,將執行該惡意**。

3、注入過程的工作方式是提前終止文字字串,然後追加乙個新的命令。由於插入的命令可能在執行前追加其他字串,因此攻擊者將用注釋標記「--」來終止注入的字串。執行時,此後的文字將被忽略。

如何預防:

這裡舉3種常見的情況:數字、日期時間、字串。

1、數字

假設我們要實現乙個顯示新聞的頁面,我們可能會隨手寫下下面的**:

string

id =

request.querystring["id

"];string

sql ="

select * from news where colid="+

id;

如果傳遞過來的 id是我們想像的 數字(比如168),那麼自然不會有什麼問題。但是如果傳遞過來的id是「168 delete from table 」的話,那麼sql的值就變成了「select * from table where colid=168 delete from news」。對於sql server來說是支援一次提交多條sql語句的,這個為我們提供了方便之餘也為sql注入敞開了大門。顯然如果這條sql語句被執行的話,那麼news表裡的記錄就都沒有了。

那麼如何預防呢?很簡單,因為colid欄位的型別是int的,那麼我們只需要驗證一下傳遞過來的id是不是整數就可以了。是整數就不存在注入;如果不是那麼就有可能存在注入。即使不存在注入,把乙個不是整數的id拼接進去也會造成執行錯誤。

所以說不管是不是為了預防sql注入,也都應該驗證id是不是整數。  

驗證方法嘛,可以用tryparse,可以用正則,也可以自己寫函式驗證。但是不建議用try異常的方式,因為這個有效率問題。

這裡還有乙個特殊情況,就是對於批量刪除這類的會傳遞過來多個數字,比如「1,2,3,10」,這個也需要驗證一下,萬一有人利用這個漏洞呢。至於驗證方法也很簡單,自己寫個函式就ok了。

2、日期時間

這個和數字的情況是一樣的,驗證是不是日期時間即可。

3、字串

最麻煩的就是這個了

比如我們先要按照新聞標題來進行查詢,可能寫的**:

string

key

=txttitle.text;

string

sql ="

select * from news where title like '%"+

key +"

%'"那麼用了單引號又是如何注入的呢?假設key=" ' delete from news --" ,那麼sql的值就是「 select * from news where title like '%'

delete from news -- ' 」。

先用乙個單引號和前面的單引號組成一對封閉的單引號,這一對單引號內部('%')就作為字串處理,而外面的就被作為sql語句處理,而第二個單引號被 「--」給注釋掉了,這樣就保證了整個sql語句的正確性。

這是注入的一種方法。

那麼如何來防止呢?想想剛才的問題,如果沒有單引號是不是就天下太平了呢?對於這種情況(前面的「數字」的情況不算),到目前為止我是沒發現不用單引號,還能夠注入進來的方法。也許是我孤陋寡聞吧,不知道各位高手是否知道對於這種情況,不用單引號還能注入進來的方法。

既然找到了罪魁禍首,那麼就好辦了,把單引號乾掉就ok了。key = key.replace("'", "''");這時候sql的值就是」 select * from news where title like '%'' delete from news --'」。

對於sql 來說在一對單引號內部的兩個單引號表示乙個字串形式的單引號。這樣我們就把罪魁禍首改造成了字串了。在一對單引號內的「--」也是普通的字串而不代表注釋。

可以寫成這樣: select * from news where title like '%'+replace(@title,'''','''''')+'%'

並不是說只要使用引數sqlparameter就能避免sql注入了,首先可以利用引數的型別、長度等屬性判斷引數是否合法,通過這個檢測就能過濾掉一些不合法的內容,然後再儲存過程中sql語句拼接的時候,做一些處理,比如把乙個單引號replace成兩個單引號等。

罪魁禍首是單引號,想不明白為什麼有許多人都去過濾 「delete、update」這一類的關鍵字,他們都是安善良民呀,他們是很冤枉的。當然了,如果前提是程式都已經寫好了,不能修改內部**,那就另當別論了。至於「--」頂多算是**,如果您不放心的話,把他處理了也行。

總結:數字、日期時間的,驗證型別字串的,處理好單引號。

另外為了安全起見,不要用sa連線資料庫xp_cmdshell這一類的有危險的擴充套件儲存過程也應該處理一下(比如刪除)。

關於SQL注入

sql 注入的定義是sql是運算元據庫資料的結構化查詢語言,網頁的應用資料和後台資料庫中的資料進行互動時會採用sql。而sql注入是將web頁面的原url 表單域或資料報輸入的引數,修改拼接成sql語句,傳遞給web伺服器,進而傳給資料庫伺服器以執行資料庫命令。如web應用程式的開發人員對使用者所輸...

sql 注入問題

1.關於使用intval強制轉換成數字的問題。數字大於2147483647會出現溢位出現負數。使用個方法來替代這個吧 n n a 2147483648.05555 echo intval a n result 2147483648 echo int a,n result 2147483648 ech...

SQL注入問題

什麼是sql注入問題?就是在拼接sql語句時,有一些sql的特殊關鍵字參與字串拼接,會咋總成安全問題 例如 輸入使用者民名和密碼時拼接sql語句 使用者名稱任意,密碼為乙個恒等式 select from user where usernamr sadfasfa 任意 and password a o...