上篇文章谈到了sql注入式攻击,今天说一下如何防范sql注入式攻击!
其实要防止asp.net应用被sql注入式攻击闯入并不是一件特别困难的事,只要在利用表单输入的内容构造sql命令之前,把所有内容过滤一番就可以了。过滤输入内容可以按照多种方式进行。
一、对于动态构造sql查询的场合,可以用下面的技术
1、删除用户输入内容中的所有连接字符串,防止攻击者构造出“select * from Users where username='mas' -- and password=' "之类的查询,因为这类查询的后半部分已经被注视掉,不再有效,所以攻击者只要知道一个合法的用户登录名称,根本不需要知道用户的密码就可以顺利获得访问权限。
2、对于用来执行查询的数据库账户,限制其权限。用不同的用户账户执行查询、插入、更新、删除操作。由于隔离了不同账户可执行操作,因而也就防止了原本用于执行select命令的地方却被用于执行insert、update、或者delete命令。
二、用存储过程来执行所有的查询
sql参数的传递方式将防止攻击者利用单引号和连接字符串实施攻击。此外,它还使得数据库权限可以限制到只允许特定的存储过程执行,所有的用户输入必须遵循从被调用到存储过程的安全上下文,这样就很难再发生注入式攻击了。
三、限制表单或查询字符串的输入长度
如果用户的登录名最多只有十个字符,那么不要认可表单中输入10个以上的字符,这将大大增加攻击者在sql命令中插入有害的代码的难度。
四、检查用户输入的内容的合法性
确保用户输入的内容只包括合法的数据。数据检查应到在客户端和服务器端都执行,之所以要执行客户端验证,是为了弥补客户端验证机制脆弱的安全性。
在客户端,攻击者完全有可能获得网页的源代码,修改验证合法性的脚本(或者直接删除脚本),然后将非法内容通过修改后的表单提交给服务器。因此,要保证验证操作确实已经执行,唯一的办法就是在服务端也执行验证。
五、将用户登录名称、密码等数据加密保存
加密用户输入的数据,然后再将它与数据库中保存的数据比较,这相当于对用户输入的数据进行了“消毒”处理,用户输入的数据不再对数据库有任何特殊的意义,从而也就防止了攻击者注入sql命令。
六、检查提取数据的查询所返回的记录数量
如果程序只要返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。