什么是sql注入,如何防范(收集)转所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。常见的SQL注入式攻击过程类如:
⑴ 某个ASP.NET Web应用有一个登录页面,这个登录页面控制着用户是否有权访问应用,它要求用户输入一个名称和密码。
⑵ 登录页面中输入的内容将直接用来构造动态的SQL命令,或者直接用作存储过程的参数。下面是ASP.NET应用构造查询的一个例子:
System.Text.StringBuilder query = new System.Text.StringBuilder( "SELECT * from Users WHERE login = '") ;
query.Append(txtLogin.Text);
query.Append("' AND password='") ;
query.Append(txtPassword.Text).Append("'");
⑶ 攻击者在用户名字和密码输入框中输入"'或'1'='1"之类的内容。
⑷ 用户输入的内容提交给服务器之后,服务器运行上面的ASP.NET代码构造出查询用户的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
⑸ 服务器执行查询或存储过程,将用户输入的身份信息和服务器中保存的身份信息进行对比。
⑹ 由于SQL命令实际上已被注入式攻击修改,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。
如果攻击者知道应用会将表单中输入的内容直接用于验证身份的查询,他就会尝试输入某些特殊的SQL字符串篡改查询改变其原来的功能,欺骗系统授予访问权限。
系统环境不同,攻击者可能造成的损害也不同,这主要由应用访问数据库的安全权限决定。如果用户的帐户具有管理员或其他比较高级的权限,攻击者就可能对数据库的表执行各种他想要做的操作,包括添加、删除或更新数据,甚至可能直接删除表。
二、如何防范?
好在要防止ASP.NET应用被SQL注入式攻击闯入并不是一件特别困难的事情,只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。
⑴ 对于动态构造SQL查询的场合,可以使用下面的技术:
第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。再来看前面的例子,“SELECT * from Users WHERE login = ''' or ''1''=''1' AND password = ''' or ''1''=''1'”显然会得到与“SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'”不同的结果。
第二:删除用户输入内容中的所有连字符,防止攻击者构造出类如“SELECT * from Users WHERE login = 'mas' -- AND password =''”之类的查询,因为这类查询的后半部分已经被注释掉,不再有效,攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。
第三:对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、删除操作。由于隔离了不同帐户可执行的操作,因而也就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。
⑵ 用存储过程来执行所有的查询。SQL参数的传递方式将防止攻击者利用单引号和连字符实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵从被调用的存储过程的安全上下文,这样就很难再发生注入式攻击了。
⑶ 限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行——之所以要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务器端也执行验证。你可以使用许多内建的验证对象,例如RegularExpressionValidator,它们能够自动生成验证用的客户端脚本,当然你也可以插入服务器端的方法调用。如果找不到现成的验证对象,你可以通过CustomValidator自己创建一个。
⑸ 将用户登录名称、密码等数据加密保存。加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入SQL命令。System.Web.Security.FormsAuthentication类有一个HashPasswordForStoringInConfigFile,非常适合于对输入数据进行消毒处理。
⑹ 检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。
---------------------------------------------------------------------------------------------------------------------------
关键是明白原理,其实防范很简单的,
1.过滤SQL需要的参数中的敏感字符(注意加入忽略大小写)
2.禁用数据库服务器的xp_cmdshell存储过程,删除相应用到的dll
3.屏蔽服务器异常信息
//------------------------------------
/// <summary>
/// 过滤sql中非法字符
/// </summary>
/// <param name="value">要过滤的字符串 </param>
/// <returns>string </returns>
public static string Filter(string value)
{
if (string.IsNullOrEmpty(value)) return string.Empty;
value = Regex.Replace(value, @";", string.Empty); // ;
value = Regex.Replace(value, @"'", string.Empty); // '
value = Regex.Replace(value, @"&", string.Empty); //&
value = Regex.Replace(value, @"%20", string.Empty); //%20
value = Regex.Replace(value, @"--", string.Empty); //--
value = Regex.Replace(value, @"==", string.Empty); //==
value = Regex.Replace(value, @" <", string.Empty); //<
value = Regex.Replace(value, @">", string.Empty); //>
value = Regex.Replace(value, @"%", string.Empty); //%
return value;
}
//------------------------------------------------------
其实看到过不少相当“恶心”的字符串过滤做法。
凭什么用户不能输入单引号、两个减号等等符号?这明明是编程问题,不应该惩罚软件用户。
如果要拼接SQL命令,那么你可以写:
var sql="SELECT * from Users WHERE login = '"+ txtLogin.Text.Replace("\'","\'\'")+
"' AND password='"+txtPassword.Text.Replace("\'","\'\'")+"'"; //用双引号替换单引号
这里,用户实际上可以输入任何符号,完全可以输入单引号和连字符。我们看到过多的所谓范例是号称“过滤”字符的做法,一定不要照抄那些过分技术化(其实丧失了全面的功能来炫技)做法。
对于接受用户输入的字符串参数,采用上述方法。对于其它类型,采用首先强类型转换的方法,例如:
var sql="SELECT Top "+ int.Parse(txtCount.Text).ToString() from Users WHERE login = '"+ txtLogin.Text.Replace(“\'","\'\'")+ "' AND password='"+txtPassword.Text.Replace(“\'","\'\'")+"'";
除非你要求用户直接录入sql语句,否则,只要是用户录入的仅仅是参数,那么仅需要上述两个简单易行的做法就够了。
当然,使用参数(SqlParameter或者DbParameter类型对象)为sql命令提供参数是ADO.NET中最好的查询参数处理做法。而使用Linq则根本超出了ADO.NET,它本身已经是面向对象的了,也就没有了注入问题(底层类库防注入)。
有两点:字符串参数要替换一下单引号,非字符串参数要强类型转换一下。这就防止了非法SQL语句被数据库执行,不用考虑过多,要是影响程序设计(例如限制了用户输入某些符号、字符、输入长度)或者增加了编写的代码,就得不尝失了。
最基本的一定做到,但是不用考虑过多技巧
分享到:
相关推荐
SQL 注入基础知识点总结 SQL 注入是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法...
SQL注入是一种常见的网络安全漏洞,发生在应用程序使用用户输入的SQL代码直接构建数据库查询时。当攻击者能够通过输入恶意SQL语句来控制或篡改数据库查询,他们就能获取敏感信息、修改数据甚至完全控制系统。《SQL...
SQL注入是一种常见的网络安全威胁,它利用了Web应用程序中对用户输入数据处理的不足,使得攻击者能够注入恶意的SQL代码,以获取未经授权的数据或者控制数据库服务器。以下是对SQL注入漏洞的全面讲解,包括其原理、...
### SQL注入攻击实验报告知识点详解 #### 一、实验背景及目的 - **实验背景**:随着互联网技术的发展,Web应用程序越来越广泛地应用于各种场景之中。然而,由于开发者对安全性的忽视,使得许多Web应用程序存在安全...
C#防SQL注入 C#防SQL注入是指在C#程序中防止SQL注入攻击的方法。SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在输入字段中.inject恶意SQL代码,来访问、修改或删除数据库中的数据。为了防止SQL注入,C#...
SQL注入是一种严重的安全威胁,它允许攻击者通过在应用程序的输入字段中插入恶意SQL代码来执行未经授权的数据库操作。攻击者通常寻找没有适当验证和过滤的用户输入,然后利用这些漏洞来构造能改变原始SQL语句意图的...
DB2数据库SQL注入手册 DB2数据库SQL注入手册是指在使用DB2数据库时,如何检测和防止SQL注入攻击的一份指南。SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过在输入字段中 inject恶意SQL代码来访问或控制...
"SQL注入漏洞全接触"知识点总结 一、 SQL注入漏洞的定义和原理 * SQL注入漏洞是指攻击者通过构造特殊的输入,来获取或修改服务器上的敏感数据。 * SQL注入漏洞的原理是从客户端提交特殊的代码,从而收集程序及...
SQL注入是一种常见的网络安全漏洞,主要出现在使用动态SQL语句构建数据库查询的应用程序中。这个"sql注入网站源码"提供了一个具有SQL注入漏洞的ASP(Active Server Pages)网站实例,对于学习如何检测、防范和修复这...
【描述】:“SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑SQL注入工具-御剑” 描述中的重复部分强调了御剑作为SQL注入工具的核心属性。SQL注入是黑客通过构造恶意的SQL语句...
SQL手工注入大全:包含各种类型的SQL注入,实现手工注入的乐趣,此资源你值得拥有。 此资源包含:宽字节注入、SQL手工注入漏洞测试(Oracle数据库)、SQL手工注入漏洞测试(Sql Server数据库)、SQL手工注入漏洞测试...
机器学习检测SQL注入# ML-for-SQL-Injection机器学习检测SQL注入本项目是使用机器学习算法来分类SQL注入语句与正常语句:使用了SVM,Adaboost,决策树,随机森林,逻辑斯蒂回归,KNN,贝叶斯等算法分别对SQL注入语句...
### SQL注入字典Fuzz详解 #### 一、引言 在网络安全领域,SQL注入攻击是一种常见的威胁方式,它利用数据库应用系统中的漏洞,通过恶意构造的SQL语句来获取敏感数据或对数据库进行非法操作。为了有效地检测和防范...
从标签"防注入"、"最新ASP SQL注入代码"、"最新ASP通用防SQL注入代码"我们可以看出,这个压缩包文件的核心内容是关于防止ASP应用程序遭受SQL注入攻击的代码示例,它适用于各种ASP应用场景。 在压缩包内的文件"通用...
### .NET中SQL注入式攻击与防范秘籍 #### SQL注入概述 SQL注入是一种常见的网络安全攻击方式,攻击者通过在数据库查询中插入恶意SQL语句,以达到非法获取数据、篡改数据甚至控制整个数据库的目的。对于使用.NET...
在IT行业中,SQL注入是一种常见的安全威胁,攻击者通过输入恶意的SQL代码来获取、修改、删除数据库中的敏感信息。为了防止这种情况发生,开发者需要在应用程序中实施有效的防御策略,其中一种方法就是使用过滤器...
### Python中防止SQL注入的方法详解 #### 前言 SQL注入是一种常见的网络安全攻击手段,攻击者通过在输入数据中嵌入恶意SQL代码,利用应用程序的漏洞执行非法操作,如篡改、删除或检索敏感数据等。对于使用Python...
**SQL注入工具——PangolinsDL详解** SQL注入是一种常见的网络安全漏洞,它允许攻击者通过输入恶意的SQL代码来操纵或获取数据库中的敏感信息。针对这种威胁,开发者和安全研究人员常常使用SQL注入工具来进行测试和...
SQL注入攻击与防御技术白皮书.pdf 本文档主要介绍了SQL注入攻击的原理、方式、危害及防御措施,旨在帮助读者更好地理解和防御这种常见的数据库漏洞攻击方式。 1.SQL注入攻击简介 SQL注入攻击是一种针对数据库的...
SQL注入是网络安全领域中的一种常见的攻击手段,它允许攻击者通过在应用程序的输入参数中插入恶意的SQL代码片段,从而在数据库服务器上执行未授权的查询或操作。这种攻击方法对数据库安全构成了极大的威胁,因此了解...