数据库注入的防范

数据库注入的防范

对于一个项目来说,安全永远是重中之重。没有安全,信息将会泄露,应用的稳定性也堪忧。一个不安全的项目,对一个企业、组织的影响是严重而深远的。轻则麻烦缠身,重则伤筋动骨,甚至濒临倒闭。因此安全很重要。

而数据库注入又是近年来流行的攻击方式,凡是大型应用,很少有不使用数据库的,数据库注入荣登多年OWASP10大安全漏洞榜。因此,做好数据库注入防范十分重要。

下面是有效防范数据库注入的方法。

1.不要手写拼接数据库语句

类似这样的语句,请千万不要出现在您的代码之中:

username = requests.POST['username']
password = requests.POST['password']
user = User.objects.raw("select * from account_info where username = '" + username + "' and password = '" + password + "'")
if len(user) == 1:
	# ......

这十分危险,用户的输入没有任何的过滤,假如用户输入的username是23333 or 1=1 --

那么这条数据库语句就变成

select * from account_info where username = '23333 or 1=1 -- ' and password = 'somthing_not_important'

这就是所谓的万能用户,事实上,配合盲注、报错注入等技巧,用户甚至可以获得您的数据库的所有信息,这些技巧在我的博文数据库注入总结有总结,如果您不得已打算手写拼接数据库语句,请务必做好过滤,防范那篇文章内容涉及的攻击,这是很基础的。

不然,您可以选择更加方便安全的方法

2.使用框架附带的数据库操作方法

上面危险的代码可以改成

try:
    result = account_info.objects.get(username=tusername, password=tpassword)
except account_info.DoesNotExist:
    return dealResponse(406)

通常框架附带的代码,会把传入的参数作为语义而不是直接拼接到查询语句上,这样就能避免很多数据库注入的问题。

而且上述的代码在兼容性上也有优势,只要修改数据库配置文件,这份代码就可以轻松复用到PostgreSQL, Oracle, SQLite, MongoDB等数据库上。

3.使用WAF

如果还不放心,可以尝试使用WAF,Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)

这个不仅仅是防护数据库注入的,对于其它的攻击,例如模板攻击、命令注入、XSS等也有防护作用。

而且,用户输入过滤只是WAF的一个很小的功能,WAF还提供异常检测协议、及时补丁、基于规则的保护和基于异常的保护、状态管理等防护技术。

WAF有硬件层面和软件层面的,类型丰富多样,如果您的网站有需求,它能一次性解决很多问题。

你可能感兴趣的:(数据库注入的防范)