SQL注入
将用户输入拼接到数据库将要执行的SQL语句中 导致攻击者可以修改原有执行的SQL语句
例子
正常请求 ?id=123
执行SQL
攻击者构造请求: ?id=123 UNION SELECT name,password FROM users;
执行SQL
攻击者改变了原有的SQL语句逻辑
常见过滤/防护
addslashes 在单引号(')、双引号(")、反斜线(\)与 NUL前加上反斜线 可用于防止SQL注入
mysqli::real_escape_string mysqli::escape_string mysqli_real_escape_string mysql_real_escape_string SQLite3::escapeString
以上函数会在\x00(NULL), \n, \r, , ', " 和 \x1a (CTRL-Z)前加上反斜线 并考虑了当前数据库连接字符集进行处理
注意: 经过以上函数处理后的字符串不可直接用于sql查询拼接 需要使用引号包裹后拼接到sql语句中 否则仍可导致sql注入
例如 上文中的例子 攻击者输入并没有使用到引号反斜线 逗号可使用其他方法绕过 仍可构成SQL注入
防护方法
PDO::quote 转义特殊字符 并添加引号
PDO::prepare 预处理SQL语句 有效防止SQL注入 (推荐)
intval($input) floatval() floatval() floor() (int)$input num+0
将输入强制转换为整数/浮点 用于整数/浮点类型的输入参数处理 可防止SQL注入
一些执行SQL语句的函数
最后更新于