SQL注入的防御

本文最后更新于 2024年8月14日 上午

参数加密

只要攻击者无法知道参数的加密逻辑,就无法对参数进行SQL注入尝试。

但,虽然加密参数可以增加安全性,但它并不能完全替代其他安全措施。攻击者可能会尝试对加密的参数进行逆向,因此依赖加密而不使用其他防御措施是不足够的。于是参数加密只是增加了SQL注入的难度,没有完全防御SQL注入

严格的输入校验

不使用黑名单校验,而是白名单校验。

检查内容的合法性与合理性,而不是一味地去过滤关键字、函数、符号,因为攻击者总能找到没有被完全过滤的SQL语句去攻击,于是最好还是白名单校验,只允许输入某种特定的内容。

限制用户输入内容的长度

因为大部分SQL攻击语句都很长,只要限制了输入长度就能杜绝好一部分SQL注入攻击了

限制数据类型

强制执行适当的限制与转换,并在用户提交请求的时候进行检查,比如只需要数字型数据的地方,最好就限制用户不允许输入字符型数据,或者后端自动转化为数字型数据,这样一来SQL攻击语句就无效了。凡不符合类型的提交就认为是非法请求

数据库权限最小化原则

根据程序要求为特定的表设置特定的权限,严格区分普通用户与管理员用户的权限。

除了设置特定权限,还应避免使用具有广泛权限的数据库账户进行应用程序操作。数据库用户应具有最少的必要权限,以减少潜在的攻击面

严格限制目录权限

WEB目录应遵循”可写目录不可执行,可执行目录不可写”的原则,在此基础上,对各目录进行必要的权限细化。建议是不要给执行权限。

除了”可写目录不可执行,可执行目录不可写”的原则,还应定期审查和更新目录权限配置。确保不必要的目录和文件不会被暴露或修改

预编译

使用参数而不是将用户输入变量嵌入到SQL语句中,可以杜绝大部分的SQL注入攻击。

但是也要特别注意预编译的局限性与预编译场景下的SQL注入攻击