PHP 5.4.0 起 magic_quotes_gpc 已移除,GPC 数据默认原始未转义;需废弃 stripslashes() 和 get_magic_quotes_gpc() 判断,改用预处理语句防 SQL 注入,并按输出上下文(HTML/JS等)做最小化转义。

PHP 5.4.0 起 magic_quotes_gpc 已被彻底移除,不再可用。它原本自动对 GET、POST、COOKIE 数据中的单引号、双引号、反斜线和 NULL 字符加反斜线转义,初衷是简化 SQL 注入防护,但实际带来混乱:开发者难以判断数据是否已被转义,容易重复转义或遗漏处理,反而增加安全风险。
检查并清理旧代码中的 stripslashes() 调用
很多老项目在接收 GPC 数据后习惯性调用 stripslashes() 来“去掉 magic quotes 添加的反斜线”。现在这个操作不仅多余,还可能破坏正常含反斜线的用户输入(比如密码 pa\ss'word)。
- 全局搜索代码中类似
$_GET、$_POST、$_COOKIE后紧跟stripslashes()的用法 - 删除所有为兼容 magic quotes 而写的条件判断,例如:
if (get_magic_quotes_gpc()) { ... } - 确认数据库操作前的数据状态——现在所有 GPC 数据都是原始未转义的,需按需处理
改用预处理语句防止 SQL 注入
不再依赖自动转义,应使用数据库层的机制从根本上杜绝注入风险。
本套教程,以一个真实的学校教学管理系统为案例,手把手教会您如何在一张白纸上,从零开始,一步一步的用ThinkPHP5框架快速开发出一个商业项目,让您快速入门TP5项目开发。
- MySQLi 或 PDO 都支持预处理语句(Prepared Statements)
- 参数与 SQL 结构分离,用户输入不参与 SQL 拼接,无需手动转义
- 例如 PDO 中:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?"); $stmt->execute([$name]);
输出时注意 HTML/JS 上下文转义
GPC 数据未被自动处理,直接输出到 HTML 页面可能引发 XSS。需根据使用场景选择对应转义方式:
- 插入 HTML 文本内容:用
htmlspecialchars($str, ENT_QUOTES, 'UTF-8') - 插入 HTML 属性值(如
value="..."):同样用htmlspecialchars,确保引号被编码 - 插入 JavaScript 字符串:不能只靠
htmlspecialchars,推荐用json_encode($str, JSON_UNESCAPED_UNICODE)并包裹在引号内 - 不要用
addslashes()或mysql_real_escape_string()替代预处理——它们已过时且不安全
统一数据过滤策略,避免混用多种转义
明确每个数据的生命周期:从输入 → 存储 → 输出,各阶段职责分明。
- 输入阶段:验证格式(如邮箱正则)、截断超长字段、去除明显恶意标签(可选)
- 存储阶段:不“净化”,不“转义”,保持原始语义;靠预处理语句保证入库安全
- 输出阶段:按目标上下文做最小必要转义(HTML、JS、URL、Shell 等)
- 避免在模型层、视图层、控制器层重复做转义,容易叠加出错

















