SQL防御

81 阅读3分钟

SQL防御

控制访问权限

普通用户与系统管理员用户权限要严格划分,限制网站用户的数据库操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害

控制最小信息返回

避免直接向用户显示数据库错误,比如类型错误,字段不匹配等,防止攻击者利用错误信息进行一些判断

防止用户遍历

预编译,强迫使用参数化语句

预编译(PreparedStatement),如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。

加强对用户输入的验证

对用户输入的特殊字符进行严格过滤,如’、”、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union、drop、delete

加强对用户输入内容的检查和验证,强迫使用参数化语句来传递用户输入的内容。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。

数据库自带的安全参数

为了减少注入式攻击对于MySQL数据库的不良影响,在MySQL数据库专门设计了相对安全的SQL参数。在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。比如尽量不要开放外网的权限,不要设置文件可以任意上传。

mysql_file_priv

多层环境验证

在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。实现多层验证。对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。

sql_waf书写

function sql_waf($param ){
    $param = str_ireplace("and","sql_waf",$param);
    $param = str_ireplace("&","sql_waf",$param);
    $param = str_ireplace("or","sql_waf",$param);
    $param = str_ireplace("|","sql_waf",$param);
    $param = str_ireplace("data","sql_waf",$param);
    $param = str_ireplace("#","sql_waf",$param);
    $param = str_ireplace("-","sql_waf",$param);
    $param = str_ireplace("user","sql_waf",$param);
    $param = str_ireplace("select","sql_waf",$param);
    $param = str_ireplace("update","sql_waf",$param);
    $param = str_ireplace("insert","sql_waf",$param);
    $param = str_ireplace("delete","sql_waf",$param);
    $param = str_ireplace("drop","sql_waf",$param);
    $param = str_ireplace("extract","sql_waf",$param);
    $param = str_ireplace("version","sql_waf",$param);
    $param = str_ireplace("value","sql_waf",$param);
    $param = str_ireplace("floor","sql_waf",$param);
    $param = str_ireplace("char","sql_waf",$param);
    $param = str_ireplace("exp","sql_waf",$param);
    $param = str_ireplace("*","sql_waf",$param);
    $param = str_ireplace("sleep","sql_waf",$param);
    $param = str_ireplace("/","sql_waf",$param);
    $param = str_ireplace("=","sql_waf",$param);
    $param = str_ireplace("length","sql_waf",$param);
    $param = str_ireplace("substr","sql_waf",$param);
    $param = addslashes($param);
    // 后续有需要再补充 waf 一般不分先后,除替换为字符串外,顺序不对也不行
    return $param;
}

其它防御

addslashes()
添加 反斜杠
在 PHP 中,addslashes()函数转义以下字符:
单引号(')。
双引号(")。
反斜杠(\)。
NULL 字符。
mysqli_real_escape_string()
mysqli_real_escape_string()主要转义以下特殊字符:
单引号(')
双引号(")
反斜杠(\)
换行符(\n)
回车符(\r)
零字节(\0)
Control-Z(\x1A)
目的是防止这些特殊字符在 SQL 查询中引起语法错误或被恶意利用进行 SQL 注入攻击。
但需要注意的是,如今更推荐使用预处理语句和参数绑定的方式来确保 SQL 操作的安全性,而不是单纯依赖mysqli_real_escape_string()。