方法1:
前端调试: 使用 console.log
检查发送的数据内容:
后端调试: 在后端直接打印接收到的原始请求数据:
$rawData = file_get_contents(‘php://input’);
error_log($rawData);
对比前后数据是否一致。
方法2:
关键点分析
pplic
ation/x-www-form-urlencoded
的转义行为
JSON 特殊字符被转义为 URL 编码形式,例如:
{
→%7B
}
→%7D
"
→%22
如果被多次转义,会出现嵌套的转义,例如:
"
→%22
→%2522
(注意%25
是%
的转义)。
判断是否多次转义
- 判断是否包含
%
和%25
等编码特征。 - 尝试解码字符串,看是否仍然是 JSON 格式。
1. 使用正则表达式检查是否包含 URL 编码
function isUrlEncoded($str) {
return preg_match(‘/%[0-9A-Fa-f]{2}/’, $str);
}
2. 检查是否是有效的 JSON
function isValidJson($str) {
json_decode($str);
return json_last_error() === JSON_ERROR_NONE;
}
function isMultiEncodedJson($str) {
// 先判断是否包含 URL 编码
if (!isUrlEncoded($str)) {
return false; // 没有 URL 编码,不可能多次转义
}
// 尝试解码一次
$decodedOnce = urldecode($str);
// 如果解码一次后是有效 JSON,说明是一次转义的 JSON
if (isValidJson($decodedOnce)) {
return false; // 一次转义
}
// 尝试解码两次
$decodedTwice = urldecode($decodedOnce);
// 如果解码两次后是有效 JSON,说明是多次转义的 JSON
return isValidJson($decodedTwice);
}