DWR请求CSRF漏洞修复后仍被Contrast Agent检测问题咨询
我有一个基于WildFly 10、Java 8运行的Java应用,请求以DWR请求形式发送,采用POST方法。我们在应用上运行Contrast安全Agent,它检测到DWR调用(如保存、删除操作,示例接口:/DWR/call/plaincall/ABCService.saveConfig.dwr)存在Cross-Site Request Forgery(CSRF)漏洞。
我尝试了以下修复方案,但Contrast Agent仍检测到漏洞:
- 在发起请求前生成CSRF令牌并保存到会话中;
- 发起DWR请求前从会话中获取令牌;
- 将令牌作为请求参数添加到请求中;
- 后端读取令牌并与会话中保存的令牌进行验证,验证通过才执行操作。
请问该如何解决此问题?Contrast Agent是否兼容DWR请求并检测此类请求的漏洞?
前端代码示例
AbcService.saveConfiguration = function(csrfToken, configuration, callback) { dwr.engine._execute(AbcService._path, 'AbcService', 'saveConfiguration', csrfToken.token, configuration, callback); }
后端验证代码示例
if (!CsrfTokenUtil.isValidCsrfToken(csrfToken, request.getSession())) { return; }
一、Contrast Agent对DWR的兼容性
Contrast Agent支持检测DWR请求的CSRF漏洞,但DWR请求的参数结构、传输方式有特殊性,Agent需要特定条件才能识别你的修复措施。
二、修复不被识别的可能原因及解决办法
令牌传输位置不符合检测逻辑
Contrast通常期望CSRF令牌放在请求头(如X-CSRF-Token)或标准表单字段中,而非普通请求参数。你可以尝试:- 修改前端,将令牌放入请求头:
dwr.engine.setHeader("X-CSRF-Token", csrfToken.token); - 后端从请求头读取令牌完成验证,而非从请求参数中获取。
- 修改前端,将令牌放入请求头:
验证逻辑存在疏漏
检查CsrfTokenUtil.isValidCsrfToken方法是否存在以下问题:- 令牌生成是否足够随机唯一,避免可预测性;
- 是否正确处理会话为空的场景,比如直接拦截未登录用户的请求;
- 验证失败后是否返回明确的拒绝响应(如403状态码),而非仅执行
return——Contrast需要识别到明确的拒绝动作才会判定漏洞已修复。
Agent配置或扫描逻辑问题
- 确认Contrast Agent为最新版本,旧版本对DWR的支持可能不完善;
- 查看控制台中该漏洞的详细报告,确认Agent是否识别到你的CSRF令牌参数,是否因参数名不标准(如非
csrfToken、_csrf)而判定无效,可尝试改用标准参数名; - 重新触发扫描,确保Agent捕获到修复后的请求样本。
DWR请求的特殊结构影响
DWR请求体格式为callCount=1&scriptSessionId=xxx&c0-scriptName=AbcService&c0-methodName=saveConfiguration&c0-param0=...,令牌作为参数会被封装到特定位置(如c0-param0),Contrast可能无法识别该参数为CSRF令牌。这种情况下,优先通过请求头传递令牌,或在Contrast配置中关联该参数为CSRF验证字段。
内容的提问来源于stack exchange,提问作者Linidu Praneeth Gunathilaka

