ADO.NET笔记——SQL注入攻击
相关知识:
- 可以通过字符串的拼接来构造一个SQL命令字符串,但是SQL命令字符串的拼接确是造成“SQL注入攻击”的重要原因。
- 考虑下列例子:从ProductCategory表中检索出Name为“Bikes”的类别信息。(示例数据库采用红皮书的数据库:AdventureWorks_WroxSSRS2012)
- 如果要凭借字符串,将写成:
string name = "Bikes";
string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";请注意:单引号是字符串的起止标记。
- 但是,如果name变量不是由程序硬编码,而是由用户输入(比如,从页面输入框),那么就有可能有“非法”输入。例如:
string name = "Bikes'; DELETE FROM Production.ProductCategory;'";
string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";请注意:在Bikes之后添加了一个单引号,以便与"… Name='" + name + "'"构成一个语句合法的SQL语句,成为下面的样子而被执行:
"SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='Bikes'; DELETE FROM Production.ProductCategory;";
在这种情况下,strCmd将首先执行SELECT语句,然后执行DELETE语句。
- 这种情况极其危险。其根源在于单引号作为字符串的起止标记,用户非法输入的字符串被程序的SQL字符串拼接后,对数据库造成了严重威胁。这被称为SQL注入攻击。
- 如果要凭借字符串,将写成:
- 因为注入攻击是由于单引号引起的,所以,很自然的一种缓解的办法就是,不要让单引号解释成为“字符串的起止符”,而是仅仅作为单引号符号。
- 在SQL中,如果要表示一个单引号符号,需要使用:''。(这不是一个双引,而是两个单引连这写。)
- 因此,如果把命令字符串中的所有单引号都替换成为两个单引号,就能有效减少SQL注入攻击:
string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";
string strCmdEncoded = strCmd.Replace("'", "''");
代码示例:
static void Main(string[] args)
{
string userName = "xxx";
string password = "xxx' OR '1'='1"; //构造一个可能产生SQL注入攻击的字符串
string strCmd = "SELECT AccountID FROM Account WHERE AccountName='" + userName +
"' AND Password='" + password + "'";
//下面的语句把单引号替换为两个单引号,从而使之不再代表字符串的起止,进而消除了SQL注入攻击
//strCmd = strCmd.Replace("'", "''"); string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pws=root";
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
SqlCommand cmd = new SqlCommand(strCmd, conn);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.Read())
{
Console.WriteLine("登录成功!");
}
else
{
Console.WriteLine("用户名或密码错误!");
}
conn.Close();
}
程序分析:
- 程序本意是:如果userName和password在数据中匹配存在,那就返回该用户对应的AccountID,表示登陆成功;如果不匹配,那就表示失败。
- 但是经过设计一个SQL注入攻击的字符串(见示例代码),无论输入怎么样的用户名和密码,最终都会登陆成功。
- 取消strCmd = strCmd.Replace("'", "''");的注释,再次运行程序,将抛出一个SQL异常,这就表明SQL语句被认为不符合语法要求,SQL注入攻击失败。
ADO.NET笔记——SQL注入攻击的更多相关文章
- ADO.Net——防止SQL注入攻击
规避SQL注入 如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入Code值 p001' union select * from Info where '1'='1 //这样可 ...
- ADO.NET笔记——带参数的查询防止SQL注入攻击
相关知识: 把单引号替换成两个单引号,虽然能起到一定的防止SQL注入攻击的作用,但是更为有效的办法是把要拼接的内容做成“参数” SQLCommand支持带参数的查询,也就是说,可以在查询语句中指定参数 ...
- ADO。Net(二)——防止SQL注入攻击
规避SQL注入 如果不规避,在黑窗口里面输入内容时利用拼接语句可以对数据进行攻击 如:输入Code值 p001' union select * from Info where '1'='1 //这样可 ...
- Java学习笔记47(JDBC、SQL注入攻击原理以及解决)
JDBC:java的数据库连接 JDBC本质是一套API,由开发公司定义的类和接口 这里使用mysql驱动,是一套类库,实现了接口 驱动程序类库,实现接口重写方法,由驱动程序操作数据库 JDBC操作步 ...
- SQL注入攻击
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- SQL注入攻击[详解]
SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...
- web攻击之三:SQL注入攻击的种类和防范手段
观察近来的一些安全事件及其后果,安全专家们已经得到一个结论,这些威胁主要是通过SQL注入造成的.虽然前面有许多文章讨论了SQL注入,但今天所讨论的内容也许可帮助你检查自己的服务器,并采取相应防范措施. ...
- ADO学习笔记之注入漏洞与参数化查询
ADO学习笔记之注入漏洞与参数化查询 作为新手,在学习ADO程序时,使用 sql 语言查询数据时,很容易写类似如下代码: using (SqlConnection con = new SqlConne ...
- Web安全学习笔记 SQL注入下
Web安全学习笔记 SQL注入下 繁枝插云欣 --ICML8 SQL注入小技巧 CheatSheet 预编译 参考文章 一点心得 一.SQL注入小技巧 1. 宽字节注入 一般程序员用gbk编码做开发的 ...
随机推荐
- Web安全 之 SQL注入
随着B/S模式应用开发的发展,使用这种模式编写的应用程序也越来越多.相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,根据 ...
- asp.net等项目编译失败的原因之不能写入
本人遇到过一次生成mvc4项目失败,说是不能写入,后发现是权限问题,特此记录. 解决方案: 对C盘下的temp文件夹设置当前用户的写入权限即可.
- swift 委托代理传值
委托代理 1.定义个协议 2.声明一个委托代理 3.指定委托代理,调用委托实现的协议方法 4实现LoadingDelegate协议 代码如下: import UIKit //1.定义个协议 proto ...
- Java Script基础(八) Array数组对象
一.Array数组 JavaScript中的数组也是具有相同数据类型的一个或者多个值得集合.用法和Java中的数组类似. Array对象的常用属性和方法: 属性: length:获取数组的长度: 方法 ...
- 存储过程 <3> 和函数的区别
二.函数和存储过程的优点: 1.共同使用的代码可以只需要被编写一次,而被需要该代码的任何应用程序调用(.net,c++,java,也可以使DLL库). 2.这种几种编写.几种维护更新.大家共享的方法, ...
- CF Destroying Roads (最短路)
Destroying Roads time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- DNS的递归查询和迭代查询
百度运维部二面,直接懵逼的节奏 (1)递归查询 递归查询是一种DNS 服务器的查询模式,在该模式下DNS 服务器接收到客户机请求, 必须使用一个准确的查询结果回复客户机. 如果DNS 服务器本地没有存 ...
- oracle 数据导入导出命令
1.数据导出: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中 exp system/manager@TEST file=d:\daoc ...
- freeCodeCamp:Sorted Union
写一个 function,传入两个或两个以上的数组,返回一个以给定的原始数组排序的不包含重复值的新数组. 换句话说,所有数组中的所有值都应该以原始顺序被包含在内,但是在最终的数组中不包含重复值. 非重 ...
- CSS导航指示箭头
效果图 代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...