首页 > 后端开发 > php教程 > `mysql_real_escape_string()` 真的能防止 SQL 注入吗?

`mysql_real_escape_string()` 真的能防止 SQL 注入吗?

Susan Sarandon
发布: 2024-12-27 11:20:12
原创
342 人浏览过

Does `mysql_real_escape_string()` Really Prevent SQL Injection?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板