jQuery AJAX传含<字符的参数到PHP时被截断该如何解决?
问题原因
- 你当前的AJAX请求没有指定传输格式,jQuery默认会将传入的data对象序列化为
application/x-www-form-urlencoded表单键值对格式发送,参数值中的<属于HTTP传输和后端接收场景下的敏感字符。 - 你的PHP后端大概率开启了自定义的输入过滤/防XSS逻辑,会将
<识别为HTML标签的起始符直接截断后续内容,你收到的异常数据里出现<br />、>转义字符也印证了后端存在针对HTML格式内容的处理逻辑。 - 传输前未对特殊字符做编码处理,也没有明确告知后端传输的内容格式,导致后端用表单解析规则处理时出现误判。
解决方法
- 方案1:指定JSON格式传输(更推荐,兼容性更好)
前端修改AJAX配置,添加JSON序列化和Content-Type声明:
mi_json['textarea_anamnesis_proxima'] = 'Ex+lab+270721\nGOT+48,+GPT+48,+GGT+124+(>),+FA+139+(>)\nPCR+1.3+(<)+|+;+as+a+asacdfd+dfd+weaewe+we+´+++as+as+as+as+asqwq+qwq+qw\ngsdff+\nfdfsfsf+sfs+sdf+sdf+sdfs+er+aadase+ase\n'; console.log(mi_json); $.ajax({ url: 'graba_consult2.php', data: JSON.stringify(mi_json), // 先将对象序列化为JSON字符串 type: 'POST', cache: false, contentType: 'application/json', // 明确指定传输格式为JSON success: function(data) { console.log("->"+data+"<-"); } });
后端PHP侧调整解析逻辑,从原始输入流读取JSON内容:
$input = file_get_contents('php://input'); $mi_json = json_decode($input, true); // 此时$mi_json中存储的就是完整的原始参数值
- 方案2:保持表单提交格式,手动编码特殊字符
如果不需要改动后端现有接收逻辑,可以在前端传输前对参数值做URL编码:
mi_json['textarea_anamnesis_proxima'] = encodeURIComponent('Ex+lab+270721\nGOT+48,+GPT+48,+GGT+124+(>),+FA+139+(>)\nPCR+1.3+(<)+|+;+as+a+asacdfd+dfd+weaewe+we+´+++as+as+as+as+asqwq+qwq+qw\ngsdff+\nfdfsfsf+sfs+sdf+sdf+sdfs+er+aadase+ase\n');
后端接收后调用urldecode()即可得到完整的原始内容。
额外说明:如果PHP端存在全局XSS过滤规则,建议调整逻辑不要直接截断<开头的内容,改用htmlspecialchars()等函数做实体转义处理,避免误删正常业务内容。
内容的提问来源于stack exchange,提问作者jpleouf
相关产品推荐
相关产品推荐

