使用參數(shù)化查詢防止SQL注入漏洞

SQL注入的原理
以往在Web應(yīng)用程序訪問數(shù)據(jù)庫時(shí)一般是采取拼接字符串的形式,比如登錄的時(shí)候就是根據(jù)用戶名和密碼去查詢:
string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" + password + "'";
其中userName和password兩個(gè)變量的值是由用戶輸入的。在userName和password都合法的情況下,這自然沒有問題,但是用戶輸入是不可信的,一些惡意用戶只要用一些技巧,就可以繞過用戶名、密碼登錄。
假設(shè)password的值是"1' or '1' = '1",userName的值隨便取,比如是"abc",那變量sql的值就是:
"SELECT TOP 1 * FROM [User] WHERE UserName = 'abc' AND Password = '1' or '1' = '1'"
由于'1' = '1'恒為真,因此只要User表中有數(shù)據(jù),不管UserName、Password的值是否匹配,這條SQL命令準(zhǔn)能查出記錄來。就這樣,登錄系統(tǒng)就被破解了。
以往的防御方式
以前對付這種漏洞的方式主要有三種:
- 字符串檢測:限定內(nèi)容只能由英文、數(shù)字等常規(guī)字符,如果檢查到用戶輸入有特殊字符,直接拒絕。但缺點(diǎn)是,系統(tǒng)中不可避免地會有些內(nèi)容包含特殊字符,這時(shí)候總不能拒絕入庫。
- 字符串替換:把危險(xiǎn)字符替換成其他字符,缺點(diǎn)是危險(xiǎn)字符可能有很多,一一枚舉替換相當(dāng)麻煩,也可能有漏網(wǎng)之魚。
- 存儲過程:把參數(shù)傳到存儲過程進(jìn)行處理,但并不是所有數(shù)據(jù)庫都支持存儲過程。如果存儲過程中執(zhí)行的命令也是通過拼接字符串出來的,還是會有漏洞。
參數(shù)化查詢
近年來,自從參數(shù)化查詢出現(xiàn)后,SQL注入漏洞已成明日黃花。
參數(shù)化查詢(Parameterized Query 或 Parameterized Statement)是訪問數(shù)據(jù)庫時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給值。
在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫完成SQL指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有指令,也不會被數(shù)據(jù)庫運(yùn)行。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ù)。
var conn = Server.CreateObject("ADODB.Connection");
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");
conn.Open();
var cmd = Server.CreateObject("ADODB.Command");
cmd.ActiveConnection = conn;
cmd.CommandType = 1;
cmd.CommandText = "SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?";
cmd.Parameters.Append(cmd.CreateParameter("@UserName", 200, 1, 20, "user01"));
cmd.Parameters.Append(cmd.CreateParameter("@Password", 200, 1, 16, "123456"));
var rs = cmd.Execute();
Response.Write(rs("UserId").value);
rs.Close();
conn.Close();
在ASP.NET程序中使用參數(shù)化查詢
ASP.NET環(huán)境下的查詢化查詢也是通過Connection對象和Command對象完成。如果數(shù)據(jù)庫是SQL Server,就可以用有名字的參數(shù)了,格式是“@”字符加上參數(shù)名。
SqlConnection conn = new SqlConnection("server=(local)\\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password");
cmd.Connection = conn;
cmd.Parameters.AddWithValue("UserName", "user01");
cmd.Parameters.AddWithValue("Password", "123456");
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();
MySQL的參數(shù)格式與SQL Server有點(diǎn)區(qū)別,是以“?”加上參數(shù)名。
MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;");
conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1");
cmd.Connection = conn;
cmd.Parameters.AddWithValue("UserName", "user01");
cmd.Parameters.AddWithValue("Password", "123456");
MySqlDataReader reader = cmd.ExecuteReader();
reader.Read();
int userId = reader.GetInt32(0);
reader.Close();
conn.Close();
相關(guān)文章
thinkphp代碼執(zhí)行g(shù)etshell的漏洞解決
本文來介紹一下thinkphp官方修復(fù)的一個(gè)getshell漏洞,框架對控制器沒有進(jìn)行足夠的檢測導(dǎo)致的一處getshell,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨2018-12-12記 FineUI 官方論壇discuz所遭受的一次真實(shí)網(wǎng)絡(luò)攻擊
這篇文章主要介紹了記 FineUI 官方論壇discuz所遭受的一次真實(shí)網(wǎng)絡(luò)攻擊,需要的朋友可以參考下2018-11-30- 這篇文章主要介紹了Linux 下多種反彈 shell 方法,需要的朋友可以參考下2017-09-06
- 這篇文章主要為大家介紹了基于反射的XSS攻擊,主要依靠站點(diǎn)服務(wù)端返回腳本,在客戶端觸發(fā)執(zhí)行從而發(fā)起Web攻擊,需要的朋友可以參考下2017-05-20
- 這篇文章主要介紹了SQL注入黑客防線網(wǎng)站實(shí)例分析,需要的朋友可以參考下2017-05-19
ASP+PHP 標(biāo)準(zhǔn)sql注入語句(完整版)
這里為大家分享一下sql注入的一些語句,很多情況下由于程序員的安全意識薄弱或基本功不足就容易導(dǎo)致sql注入安全問題,建議大家多看一下網(wǎng)上的安全文章,最好的防范就是先學(xué)2017-05-19- 對于目前流行的sql注入,程序員在編寫程序時(shí),都普遍的加入防注入程序,有些防注入程序只要在我們提交一些非法的參數(shù)后,就會自動(dòng)的記錄下你的IP地址,提交的非法參數(shù)和動(dòng)作等,2017-04-29
XSS繞過技術(shù) XSS插入繞過一些方式總結(jié)
我們友情進(jìn)行XSS檢查,偶然跳出個(gè)小彈窗,其中我們總結(jié)了一些平時(shí)可能用到的XSS插入方式,方便我們以后進(jìn)行快速檢查,也提供了一定的思路,其中XSS有反射、存儲、DOM這三類2016-12-27Python 爬蟲使用動(dòng)態(tài)切換ip防止封殺
這篇文章主要介紹了Python 爬蟲使用動(dòng)態(tài)切換ip防止封殺的相關(guān)資料,需要的朋友可以參考下2016-10-08使用爬蟲采集網(wǎng)站時(shí),解決被封IP的幾種方法
這篇文章主要介紹了使用爬蟲采集網(wǎng)站時(shí),解決被封IP的幾種方法的相關(guān)資料,需要的朋友可以參考下2016-10-08