addslashes 不该用于防 SQL 注入;PHP 5.4 前 magic_quotes_gpc 自动转义,再手动调用会导致重复转义如 O''reilly;应使用预处理语句。

addslashes 现在基本不该用了——它不是防 SQL 注入的正确工具,也不该用于现代数据库操作。
什么时候会触发重复转义?
PHP 5.4 之前默认开启 magic_quotes_gpc,对所有 $_GET、$_POST、$_COOKIE 数据自动调用 addslashes()。如果你再手动调用一次,就会出现 O''reilly 这种双反斜杠。
- 用
get_magic_quotes_gpc()检测(仅 PHP - 现代环境(PHP ≥ 5.4 或已禁用该指令)返回
false,但别依赖这个函数,它已被移除; - 更稳妥的做法是:**永远假设输入未被转义,也永远不假设已被转义**,统一自己处理。
为什么不能拿 addslashes 防 SQL 注入?
addslashes() 只按字面加反斜杠,不感知字符集、不校验上下文。遇到宽字节注入(如 GBK 编码下 %A1%5C 可绕过), 会被吃掉,单引号直接逃逸。
- MySQLi 推荐用
mysqli_real_escape_string()(需已建立连接); - PostgreSQL 用
pg_escape_string(); - 最安全的是预处理语句:
mysqli_prepare()或 PDO 的prepare()+bind_param(); -
addslashes()唯一还勉强能用的场景:拼接进eval()或写入文件前做基础 shell 字符防护(但eval()本身就不该用)。
addslashes 和 addcslashes 有什么区别?
addslashes() 是固定字符集转义('、"、、
