Ajax POST提交富文本格式化HTML内容返回403错误问题求助
问题描述
- 场景:自主纯手写搭建博客网站,在自研后台管理面板中开发了文章新增、编辑表单,博客富文本内容采用第三方富文本编辑器实现。
- 提交逻辑:未使用标准
<form>元素,为各输入项配置独立id属性,绑定按钮onclick事件触发JavaScript流程完成数据提交,原始提交逻辑代码如下:
var article_id = encodeURIComponent(document.getElementById('article_id').value); var article_h1 = encodeURIComponent(document.getElementById('article_h1').value);//header 1 var article_h2 = encodeURIComponent(document.getElementById('article_h2').value);//short blog recap var category = encodeURIComponent(document.getElementById('category').value);//numeric category ID var author = encodeURIComponent(document.getElementById('author').value); var blog_text = encodeURIComponent(editor1.getHTML()); //getting the HTML code from richtextedit element $.ajax({ cache: false , method: 'POST', dataType:"false", data:{ 'article_id' : article_id, 'article_h1' : article_h1, 'article_h2' : article_h2, 'author' : author, 'category' : category, 'blog_text' : blog_text }, url: "./save_article.php", success: function(return_value) { document.getElementById('article_id').value=return_value } });
- 故障现象:富文本编辑器内容为空、仅包含纯文本时,Ajax调用可正常执行;一旦编辑器内存在格式化HTML数据,请求直接失败返回403错误。
- 已尝试方案:参考相关讨论调整过Ajax的contentType、请求头、dataType配置,均未解决问题;同时修改了.htaccess文件,配置如下:
php_value post_max_size 200M php_value upload_max_filesize 200M <IfModule mod_security.c> SecFilterEngine Off SecFilterScanPOST Off </IfModule>
排查与修复方案
- 优先排查安全规则拦截
你配置的mod_security关闭规则仅适配老版本mod_security.c模块,当前绝大多数服务器使用的是mod_security2版本,对应规则块为<IfModule mod_security2.c>,原有规则完全不生效。此外还要排查其他防护层:云服务商自带WAF、服务器面板内置的防注入/防XSS规则、Nginx/Apache自定义拦截规则,这类规则默认会拦截POST请求中携带的HTML标签、脚本标签等敏感特征,富文本带格式化内容时刚好触发规则,纯文本无HTML标签则不会被拦截。
验证方法:临时关闭对应站点的所有WAF/安全防护规则测试,请求恢复正常的话,针对性给富文本提交接口加白名单即可,不要长期全局关闭安全防护。 - 修正AJAX提交逻辑错误
手动对每个字段调用encodeURIComponent编码属于多余操作:jQuery发起application/x-www-form-urlencoded格式POST请求时,会自动对参数做URL编码,手动编码会导致内容二次编码,部分安全规则会把二次编码的HTML内容判定为混淆攻击特征直接拦截。直接移除所有字段外层的encodeURIComponent调用,传入原始值即可。
另外配置的dataType:"false"是非法配置,dataType仅接受json/text/html等合法值,不需要指定响应解析类型时直接删除该配置项,错误配置会导致jQuery内部解析异常,触发异常请求头被拦截。 - 排查后端PHP层拦截逻辑
全局引入的公共文件、框架自带的XSS防护逻辑通常会自动检测POST参数,一旦发现参数包含HTML标签就直接返回403。在save_article.php最开头写入日志记录,确认请求是否到达PHP文件:请求没到PHP就返回403,属于上层Web服务器/WAF问题;请求到PHP后才返回403,直接定位代码中对应拦截规则,给富文本字段跳过前置XSS检测即可,后续存储、前端输出富文本时再做针对性安全过滤。 - 确认PHP配置实际生效
部分虚拟主机、面板环境不允许通过.htaccess修改PHP运行参数,配置的post_max_size、upload_max_filesize可能并未实际生效,通过phpinfo探针查看参数实际值即可:富文本带HTML标签时内容长度远大于纯文本,如果实际POST大小限制阈值过低,也会被服务器拦截返回403。
内容的提问来源于stack exchange,提问作者FeHora
相关产品推荐
相关产品推荐

