php 7.1 彻底移除 magic_quotes_gpc,不会自动转义字符串;反斜杠必来自前端、中间件、框架或业务代码的显式处理。

PHP 7.1 已彻底移除 magic_quotes_gpc,它根本不会自动转义任何字符串 —— 如果你看到双引号变 \"、单引号变 \',那一定不是 PHP 自身行为,而是其他层在干预。
为什么 magic_quotes_gpc 在 PHP 7.1 里查不到
这个配置早在 PHP 5.4.0 就被删除了,PHP 7.0+ 中 get_magic_quotes_gpc() 函数直接报致命错误(Fatal error: Uncaught Error: Call to undefined function get_magic_quotes_gpc())。所以你在 PHP 7.1 的 php.ini 里搜 magic_quotes_gpc,连这一行都不存在。
常见误判来源:
-
前端 JavaScript 用了
JSON.stringify()或模板引擎(如 Vue/React)自动转义,发到后端的已经是带反斜杠的字符串 - 某些老旧中间件、代理(如 Nginx 的
sub_filter)、或自定义请求封装逻辑做了预处理 - 框架层手动调用了
addslashes()或类似逻辑(比如某些 ThinkPHP 2.x 兼容补丁、CI 2.x 的 input 类) - 数据库驱动(如旧版
mysql_real_escape_string)被错误地套用在非 SQL 场景
如何快速定位转义来源
别急着写 stripslashes_deep(),先确认是不是 PHP 干的:
- 在入口脚本顶部加一行:
var_dump($_POST, $_GET, $_REQUEST); exit;,看原始数据是否已含反斜杠 - 用 curl 直接模拟请求:
curl -X POST http://your.dev/test.php --data 'a="hello"\',绕过浏览器和 JS 框架 - 检查是否有
addslashes、mysqli::real_escape_string、PDO::quote等函数被无条件调用在输入数据上 - 搜索项目代码:
grep -r "addslashes\|stripslashes\|escapeString" . --include="*.php"
如果确认是框架或业务代码导致的双重转义
典型场景:ThinkPHP 3.2 或早期 CI 框架默认对 $_POST 做了 addslashes,而你又在入库前再调一次 addslashes 或使用 mysql_real_escape_string。
修复建议:
- 禁用框架自动转义:ThinkPHP 中设置
'DB_PARAMS' => array(\PDO::ATTR_EMULATE_PREPARES => true)并确保没启用DB_PREFIX相关的 escape 钩子 - 统一用 PDO 预处理语句,完全避开手动转义:
$stmt = $pdo->prepare("INSERT INTO t (content) VALUES (?)"); $stmt->execute([$raw_input]); - 若必须兼容旧逻辑,只在未转义时才处理:
$input = (function($s) { return is_string($s) ? stripslashes($s) : $s; })($_POST['field']);,但注意这仅适用于明确知道某处被多加了一层反斜杠的情况
真正容易被忽略的是:你以为在“修复转义”,其实是在掩盖上游污染。PHP 7.1 不会偷偷改你的字符串,所有反斜杠都是你或你依赖的代码亲手加的 —— 它不背这个锅。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











