SQL注入的原理以往在Web應用程序訪問數(shù)據(jù)庫時一般是采取拼接字符串的形式,比如登錄的時候就是根據(jù)用戶名和密碼去查詢: [code]string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" + password + "'";[/code] 其中userName和password兩個變量的值是由用戶輸入的。在userName和password都合法的情況下,這自然沒有問題,但是用戶輸入是不可信的,一些惡意用戶只要用一些技巧,就可以繞過用戶名、密碼登錄。 假設password的值是"1' or '1' = '1",userName的值隨便取,比如是"abc",那變量sql的值就是: [code]"SELECT TOP 1 * FROM [User] WHERE UserName = 'abc' AND Password = '1' or '1' = '1'"[/code] 由于'1' = '1'恒為真,因此只要User表中有數(shù)據(jù),不管UserName、Password的值是否匹配,這條SQL命令準能查出記錄來。就這樣,登錄系統(tǒng)就被破解了。 以往的防御方式以前對付這種漏洞的方式主要有三種:
參數(shù)化查詢近年來,自從參數(shù)化查詢出現(xiàn)后,SQL注入漏洞已成明日黃花。 參數(shù)化查詢(Parameterized Query 或 Parameterized Statement)是訪問數(shù)據(jù)庫時,在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給值。 在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成SQL指令的編譯后,才套用參數(shù)運行,因此就算參數(shù)中含有指令,也不會被數(shù)據(jù)庫運行。Access、SQL Server、MySQL、SQLite等常用數(shù)據(jù)庫都支持參數(shù)化查詢。 在ASP程序中使用參數(shù)化查詢ASP環(huán)境下的參數(shù)化查詢主要由Connection對象和Command對象完成。 Access數(shù)據(jù)庫只支持匿名參數(shù),在傳入?yún)?shù)的位置用問號代替即可。SQL Server數(shù)據(jù)庫雖然支持匿名和非匿名的參數(shù),但是在ASP中也僅能使用匿名參數(shù)。 [code]var conn = Server.CreateObject("ADODB.Connection"); 在ASP.NET程序中使用參數(shù)化查詢ASP.NET環(huán)境下的查詢化查詢也是通過Connection對象和Command對象完成。如果數(shù)據(jù)庫是SQL Server,就可以用有名字的參數(shù)了,格式是“@”字符加上參數(shù)名。 [code]SqlConnection conn = new SqlConnection("server=(local)\\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb"); MySQL的參數(shù)格式與SQL Server有點區(qū)別,是以“?”加上參數(shù)名。 [code]MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;"); |
免責聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權利,請聯(lián)系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質的創(chuàng)業(yè)信息和品牌營銷服務,與站長一起進步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨!
掃一掃,關注站長網(wǎng)微信