SQL防御
1. 预编译
- 使用预编译相当于是将数据与代码分离的方式,把传入的参数绑定为一个变量,用?表示,攻击者无法改变SQL的结构。
- 在SQL预编译过程中所有的参数替换为?占位符,语句被做成类似模板的形式去进行预编译,之后的每次执行只需要将参数放入到模板中的?即可。而不需要再进行编译,因此参数中如果出现or、and这些关键字也不会再被SQL服务将其看成是保留关键字进行词法、语法的解析。
2. PDO
-
PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。
-
防范sql注入这里使用quote()方法过滤特殊字符和通过预处理的一些方式以及bindParameter()方法绑定参数来防止SQL注入
3. 严格的正则过滤
- 但正则表达也是可以绕过的,需要结合其他方法一起防御。
4. 限制网站客户端访问数据库的权限
5. 数据类型进行严格的定义,数据长度进行严格规定
- 在查询数据库某条记录的id,定义它为整型(强制类型转换),如果用户传来的数据不满足条件,要对数据进行过滤。数据长度也可以做严格的限制,可以防止较长的SQL注入语句。
6. 对用户的输入进行转过滤
- 例如通过转义将 ’ 转义为 ’
7. 基于攻击特征的匹配过滤
- 比如说设置黑白名单