mysql_real_escape_string() 足以预防 SQL 注入吗?
虽然许多人认为使用 mysql_real_escape_string() 可以防止 SQL 注入,但确实存在旁路
缺陷
在特定情况下,例如:
mysql_query('SET NAMES gbk'); $var = mysql_real_escape_string("\xbf\x27 OR 1=1 /*"); mysql_query("SELECT * FROM test WHERE name = '$var' LIMIT 1");
由于服务器预期字符不匹配而出现问题设定和客户的看法。通过使用 'SET NAMES' 修改服务器上的字符集,mysql_real_escape_string() 可能会转义 ' 为 ASCII,而服务器期望它为纯文本。这会产生差异,允许自由悬挂 ' 和注入。
坏处
PDO 对准备好的语句的默认模拟也可能导致此漏洞。建议禁用模拟,但对不支持的查询回退到模拟可能会阻止完全保护。
丑陋
在 MySQL 4.1.20 之前,存在允许无效多字节字符的错误就像在有效负载中看到的那样,即使使用正确的客户端字符集,也会将其转义为单个字节
可取之处
使用不可渗透的字符集(如 utf8mb4 或 utf8),或启用 NO_BACKSLASH_ESCAPES SQL 模式,可以防止这种情况
结论
使用 mysql_real_escape_string() 在许多情况下仍然有效,但了解潜在的边缘情况至关重要。使用枚举字段和预准备语句等安全技术以及正确的字符集和模式配置对于全面的 SQL 注入防护至关重要。
以上是`mysql_real_escape_string()` 真的能防止 SQL 注入吗?的详细内容。更多信息请关注PHP中文网其他相关文章!