青草久久影院-青草久久伊人-青草久久久-青草久久精品亚洲综合专区-SM双性精跪趴灌憋尿调教H-SM脚奴调教丨踩踏贱奴

17站長(zhǎng)網(wǎng)

17站長(zhǎng)網(wǎng) 首頁(yè) 安全 腳本攻防 查看內(nèi)容

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

2022-9-26 14:41| 查看: 2150 |來源: 互聯(lián)網(wǎng)

SQL注入的原理 以往在Web應(yīng)用程序訪問數(shù)據(jù)庫(kù)時(shí)一般是采取拼接字符串的形式,比如登錄的時(shí)候就是根據(jù)用戶名和密碼去查詢: [code]string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' A

SQL注入的原理

以往在Web應(yīng)用程序訪問數(shù)據(jù)庫(kù)時(shí)一般是采取拼接字符串的形式,比如登錄的時(shí)候就是根據(jù)用戶名和密碼去查詢:

[code]string sql = "SELECT TOP 1 * FROM [User] WHERE UserName = '" + userName + "' AND Password = '" + password + "'";[/code]

其中userName和password兩個(gè)變量的值是由用戶輸入的。在userName和password都合法的情況下,這自然沒有問題,但是用戶輸入是不可信的,一些惡意用戶只要用一些技巧,就可以繞過用戶名、密碼登錄。

假設(shè)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命令準(zhǔn)能查出記錄來。就這樣,登錄系統(tǒng)就被破解了。

以往的防御方式

以前對(duì)付這種漏洞的方式主要有三種:

  • 字符串檢測(cè):限定內(nèi)容只能由英文、數(shù)字等常規(guī)字符,如果檢查到用戶輸入有特殊字符,直接拒絕。但缺點(diǎn)是,系統(tǒng)中不可避免地會(huì)有些內(nèi)容包含特殊字符,這時(shí)候總不能拒絕入庫(kù)。
  • 字符串替換:把危險(xiǎn)字符替換成其他字符,缺點(diǎn)是危險(xiǎn)字符可能有很多,一一枚舉替換相當(dāng)麻煩,也可能有漏網(wǎng)之魚。
  • 存儲(chǔ)過程:把參數(shù)傳到存儲(chǔ)過程進(jìn)行處理,但并不是所有數(shù)據(jù)庫(kù)都支持存儲(chǔ)過程。如果存儲(chǔ)過程中執(zhí)行的命令也是通過拼接字符串出來的,還是會(huì)有漏洞。

參數(shù)化查詢

近年來,自從參數(shù)化查詢出現(xiàn)后,SQL注入漏洞已成明日黃花。

參數(shù)化查詢(Parameterized Query 或 Parameterized Statement)是訪問數(shù)據(jù)庫(kù)時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù) (Parameter) 來給值。

在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫(kù)服務(wù)器不會(huì)將參數(shù)的內(nèi)容視為SQL指令的一部份來處理,而是在數(shù)據(jù)庫(kù)完成SQL指令的編譯后,才套用參數(shù)運(yùn)行,因此就算參數(shù)中含有指令,也不會(huì)被數(shù)據(jù)庫(kù)運(yùn)行。Access、SQL Server、MySQL、SQLite等常用數(shù)據(jù)庫(kù)都支持參數(shù)化查詢。

在ASP程序中使用參數(shù)化查詢

ASP環(huán)境下的參數(shù)化查詢主要由Connection對(duì)象Command對(duì)象完成。

Access數(shù)據(jù)庫(kù)只支持匿名參數(shù),在傳入?yún)?shù)的位置用問號(hào)代替即可。SQL Server數(shù)據(jù)庫(kù)雖然支持匿名和非匿名的參數(shù),但是在ASP中也僅能使用匿名參數(shù)。

[code]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();
[/code]

在ASP.NET程序中使用參數(shù)化查詢

ASP.NET環(huán)境下的查詢化查詢也是通過Connection對(duì)象和Command對(duì)象完成。如果數(shù)據(jù)庫(kù)是SQL Server,就可以用有名字的參數(shù)了,格式是“@”字符加上參數(shù)名

[code]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();
[/code]

MySQL的參數(shù)格式與SQL Server有點(diǎn)區(qū)別,是以“?”加上參數(shù)名

[code]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();
[/code]

本文最后更新于 2022-9-26 14:41,某些文章具有時(shí)效性,若有錯(cuò)誤或已失效,請(qǐng)?jiān)诰W(wǎng)站留言或聯(lián)系站長(zhǎng):[email protected]
·END·
站長(zhǎng)網(wǎng)微信號(hào):w17tui,關(guān)注站長(zhǎng)、創(chuàng)業(yè)、關(guān)注互聯(lián)網(wǎng)人 - 互聯(lián)網(wǎng)創(chuàng)業(yè)者營(yíng)銷服務(wù)中心

免責(zé)聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識(shí),文章和圖片版權(quán)歸原作者及原出處所有,僅供學(xué)習(xí)與參考,請(qǐng)勿用于商業(yè)用途,如果損害了您的權(quán)利,請(qǐng)聯(lián)系我們及時(shí)修正或刪除。謝謝!

17站長(zhǎng)網(wǎng)微信二維碼

始終以前瞻性的眼光聚焦站長(zhǎng)、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長(zhǎng)轉(zhuǎn)型升級(jí),為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營(yíng)銷服務(wù),與站長(zhǎng)一起進(jìn)步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨(dú)!

掃一掃,關(guān)注站長(zhǎng)網(wǎng)微信

大家都在看

    熱門排行

      最近更新

        返回頂部
        主站蜘蛛池模板: 富婆找黑人老外泻火在线播放 | 99久久精品国产免费 | 97国产视频 | 校花的奶好大好浪 | 无限资源在线观看8 | 国产成人在线视频观看 | 国产精品亚洲专一区二区三区 | 日本高清免费一本视频在线观看 | 红尘影院手机在线观看 | 国产精品99久久久精品无码 | 亚洲三级在线看 | 国产又粗又猛又爽又黄的免费视频 | 99国产在线观看 | 国产麻豆AV伦| 欧美三级在线完整版免费 | 国模孕妇模特季玥之粉红 | 亚洲成人中文 | 毛片免费播放 | 亚洲精品在线影院 | 极品少妇粉嫩小泬啪啪AV | 欧美自拍亚洲综合图区 | 欧美激情视频在线观看一区二区三区 | 性生片30分钟 | 97免费视频观看 | 中文字幕亚洲第一页 | 日韩高清一区二区三区不卡 | 国产人妻人伦精品久久无码 | 色宅男看片午夜大片免费看 | 国产69精品久久久久乱码 | www.av一区| 美国ZOOM动物在线观看 | 末班车动漫无删减免费 | swag合集120部 | 亚洲国产精品免费观看 | 国产成A人片在线观看 | 欧美香蕉大胸在线视频观看 | 1区2区3区4区产品不卡码网站 | 世界上第一个得抑郁症的人是谁 | 免费看成人毛片 | 亚洲国产精品第一影院在线观看 | 善良的小峓子2在钱免费中文字 |