Codeigniter表单提交带端口IP地址返回403 Forbidden错误解决求助
问题根因
你遇到的403报错大概率不是Codeigniter框架层面的拦截,而是服务器部署的WAF(Web应用防火墙,比如ModSecurity、云厂商内置WAF)规则触发了:纯文本格式的完整带端口URL被判定为恶意注入请求,加引号后不符合WAF的拦截规则就可以正常提交。你已经关闭CI全局XSS过滤仍出现问题,也验证了根因不在CI本身。
可行解决方案
- 方案1:前端编码+服务端解码
表单提交前用JS对IP字段做编码处理,编码后的内容不会触发WAF的URL拦截规则,服务端接收后解码即可正常使用。
前端示例代码(绑定表单submit事件):
服务端解码代码:document.querySelector('form').addEventListener('submit', function() { const ipInput = document.getElementById('ip'); ipInput.value = btoa(ipInput.value); // base64编码 })'ip' => base64_decode($this->input->post('ip')), - 方案2:拆分IP字段输入
把IP输入拆成「协议」「IP地址」「端口」三个独立输入框,前端提交前或服务端接收后再拼接成完整的http://xxx.xxx.xx.xx:xx/格式,拆分后的纯文本内容不会触发WAF拦截。 - 方案3:调整WAF规则(拥有服务器权限时可选)
定位到拦截请求的WAF规则,针对性放开/admin/subeler/add路径POST请求的URL校验规则,或者单独放开ip参数的拦截限制,调整前做好安全评估,避免恶意请求漏过。 - 方案4:优化CI侧的XSS清理逻辑
你的代码里还保留了手动XSS清理的逻辑$data = $this->security->xss_clean($data);,可以单独排除IP字段不做XSS清理,避免CI的XSS规则偶发拦截:$rawIp = $this->input->post('ip'); $data = array( 'name' => $this->input->post('name'), 'marka' => $this->input->post('grup'), 'il' => $this->input->post('il'), 'ilce' => $this->input->post('ilce'), 'databasePath' => $this->input->post('path'), 'lisanse_date'=>$this->input->post('lisans') ); $data = $this->security->xss_clean($data); $data['ip'] = $rawIp; // 单独赋值未清理的IP字段
验证建议
可以先抓包查看返回403的响应头,如果存在X-WAF-Error、Server: cloudflare这类标识,就能直接确认是WAF拦截导致的问题。
内容的提问来源于stack exchange,提问作者Çağatay Kaya
相关产品推荐
相关产品推荐

