Stripes表单POST请求被接受为GET的JS端修复方案咨询
根本解决方案(必须优先落地,是解决渗透风险的核心)
- 前端限制无法完全阻挡恶意构造的GET请求,必须首先在服务端添加请求方法校验,直接拒绝所有非POST类型的接口请求。针对你使用的Stripes框架,可直接在对应Action类或方法上添加
@HttpMethod(HttpMethod.POST)注解,强制要求接口仅接收POST请求,从根源避免GET请求被处理的问题。
前端修复方案(解决正常使用场景下的请求方法异常问题)
1. 修复Stripes表单原生配置(优先采用,比动态修改更稳定)
之前用setAttribute('method', 'POST')出现故障,通常是因为动态修改属性的时机在表单提交逻辑之后,或者和Stripes框架自身的表单处理逻辑冲突,直接在<stripes:form>标签上原生声明method即可,无需JS动态修改:
<stripes:form autocomplete="off" beanclass="com.demo.SubmitEmployeeAction" id="submitEmployeeForm" name="submitEmployeeForm" method="post">
2. 清理提交逻辑中的URL参数拼接
你现有代码里把submitEmployeeForm参数拼在了action的URL中,即使使用POST方法,这个参数依然会暴露在URL里,存在泄露风险。把这个参数移到表单隐藏域中:
首先在表单内添加隐藏域:
<stripes:hidden name="submitEmployeeForm" value="" />
然后修改JS提交逻辑,删除action后的参数拼接:
$("#submitEmp").click(function(event){ event.preventDefault(); document.submitEmployeeForm.action='SubmitEmployee.action'; $("#submitEmp").attr('disabled','disabled'); $("#submitEmployeeForm").submit(); });
3. JS层面兜底强制POST(可选,作为额外防护)
如果需要额外加一层JS校验,可监听表单submit事件强制校验请求方法:
$("#submitEmployeeForm").on('submit', function(e) { // 强制指定请求方法为POST this.method = 'POST'; // 额外校验:禁止非POST请求提交 if (this.method.toUpperCase() !== 'POST') { e.preventDefault(); return false; } });
按上述方案调整后,正常用户操作发送的请求全部为POST方法,参数都封装在请求体中不会暴露在URL里,配合服务端的方法校验即可完全解决本次渗透测试发现的问题。
内容的提问来源于stack exchange,提问作者user12872106
相关产品推荐
相关产品推荐

