SQL注入攻击实例及解决办法
比如在一个登录界面,要求输入用户名和密码:
可以这样输入实现免帐号登录:
用户名: ‘or 1 = 1 –
密 码:
点登陆,如若没有做特殊处理,那么这个非法用户就很得意的登陆进去了.(当然现在的有些语言的数据库API已经处理了这些问题)
这是为什么呢? 下面我们分析一下:
从理论上说,后台认证程序中会有如下的SQL语句:
String sql = "select * from user_table where username=
' "+userName+" ' and password=' "+password+" '";
当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=
'’or 1 = 1 -- and password='’
分析SQL语句:
条件后面username=”or 1=1 用户名等于 ” 或1=1 那么这个条件一定会成功;
然后后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
这还是比较温柔的,如果是执行
SELECT * FROM user_table WHERE
username='' ;DROP DATABASE (DB Name) --' and password=''
….其后果可想而知…
————————————————
应对方法:
1.(简单又有效的方法)参数化Parameter
参数化处理是最简单有效的方法,它内置了处理SQL注入的能力,只要在调用查询时附加参数即可,单参数过多可能会比较繁琐
使用好处:
(1).代码的可读性和可维护性.
(2).最重要的一点是极大地提高了安全性.
原理:
sql注入只对sql语句的准备(编译)过程有破坏作用
而参数化已经准备好了,执行阶段只是把输入串作为数据处理,
而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.
————————————————
示例:
//这里使用的第三方orm dapper
var parameter = new {name=input.name,password=input.password };
string sql = "select * from Table where name=@name and password=@password ";
UserModel dto =await Db.Query<UserModel>(sql, parameter);
2.使用正则表达式过滤传入的参数
3.字符串过滤
4、页面提交参数的时候直接过滤
SQL注入攻击通常由以下5步组成:
1.评估目标网站。
2.发现漏洞并获取参数。
3.构造过渡/错误消息,试图通过脚本尝试进行注入攻击。
4.使用Union来获取数据。
5.在以后的递归注入中升级攻击并执行任意SQL代码。
二、SQL注入的分类
通过SQL注入的方式,SQL注入可以分为以下类型:
1.基于错误的 SQL 注入
这种类型的SQL注入利用数据库管理系统的错误处理功能,例如未处理的查询错误或未捕获的异常,向攻击者暴露敏感信息。攻击者可以使用的技术包括:基于布尔的配置,基于时间的配置等。
2.基于 UNION 的 SQL 注入
这种SQL注入类型利用了SELECT语句可以连接多个表的属性,在应用程序中,这种语句通常用于生成动态的页面内容。攻击者可以通过使用 UNION 操作符将自己的自定义 SQL 语句插入原始 SQL 语句,并在接下来的页面输出中查看已连接的结果。
3.基于布尔的 SQL 注入
这种攻击方式基于所谓的布尔逻辑运算符,例如AND、OR和NOT,这些运算符用于判断开头或结尾的数据库行是否拥有恰当的属性。
4.基于时间的 SQL 注入
这种攻击方式基于应用程序或数据库系统无法针对某些执行查询操作的情况做出恰当响应,扫描器通过观察时延来确定攻击是否成功。这种类型的攻击在基于布尔的注入失败时可作为补充手段使用。
三、SQL注入的防御措施
在网站安全性方面,如何防止SQL注入攻击是一个非常重要的问题。以下是一些常用的SQL注入的防御措施:
1.输入验证:
应该对用户在Web应用程序中输入的所有数据进行有效的验证,包括客户端和服务器端。例如,确保输入不包含特殊字符、特殊符号或会引起SQL注入攻击的SQL代码。
2.参数化查询:
参数化查询是一种预编译SQL语句的技术,可以避免使用用户输入的数据直接构造SQL查询语句。当查询执行时,会将用户数据参数化,而不是将其放在SQL语句中。这种技术可避免SQL注入攻击。
3.最小化权限:
在应用程序代码中使用特定的数据库账户,该账户仅具有执行特定任务所需的最小权限。例如,该账户不具有更改表或数据库架构的权利。如果应用程序存在SQL注入漏洞,攻击者不会获得超出执行由特定账户所授权的最小动作所需的访问权限。
4.使用防火墙:
防火墙可以通过阻止看似可疑的SQL查询向Web应用程序或数据库发送之前的访问来拦截SQL注入攻击。这种类型的防火墙称为Web应用程序防火墙(WAF)或强制型访问控制(AMC)。
5.对错误信息进行处理:
打印应用程序的错误信息可能是SQL注入攻击的一种方式。攻击者可以通过执行恶意查询并观察打印输出,来识别漏洞。在生产环境中,不应公开应用程序的错误详细信息,应该将其映射到一个泛化的错误消息,以避免泄露敏感信息。
6.保持应用程序更新:
SQL注入攻击的漏洞通常由Web应用程序或底层软件的未处理错误引起。应用程序定期升级,以便修复已知的漏洞,并同时升级底层软件,从而使已知问题得到解决。
四、总结
SQL注入是Web应用程序安全中最常见的漏洞之一,攻击者可以通过恶意构造输入数据来尝试获取或破坏应用程序的数据。SQL注入攻击包括基于错误的SQL注入、基于UNION的SQL注入、基于布尔的SQL注入和基于时间的SQL注入等多种类型。为防止SQL注入攻击,应该采取有效的防御措施,包括输入验证、参数化查询、最小化权限、使用防火墙、对错误信息进行处理以及保持应用程序更新等。对于SQL注入攻击,我们必须认识到它的严重性,并制定有效的计划来避免其出现,从而提高网站的安全性。
————————————————
本文由 我爱PHP169 作者:admin 发表,其版权均为 我爱PHP169 所有,文章内容系作者个人观点,不代表 我爱PHP169 对观点赞同或支持。如需转载,请注明文章来源。