You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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需要特定条件才能识别你的修复措施。

二、修复不被识别的可能原因及解决办法

  1. 令牌传输位置不符合检测逻辑
    Contrast通常期望CSRF令牌放在请求头(如X-CSRF-Token)或标准表单字段中,而非普通请求参数。你可以尝试:

    • 修改前端,将令牌放入请求头:
      dwr.engine.setHeader("X-CSRF-Token", csrfToken.token);
      
    • 后端从请求头读取令牌完成验证,而非从请求参数中获取。
  2. 验证逻辑存在疏漏
    检查CsrfTokenUtil.isValidCsrfToken方法是否存在以下问题:

    • 令牌生成是否足够随机唯一,避免可预测性;
    • 是否正确处理会话为空的场景,比如直接拦截未登录用户的请求;
    • 验证失败后是否返回明确的拒绝响应(如403状态码),而非仅执行return——Contrast需要识别到明确的拒绝动作才会判定漏洞已修复。
  3. Agent配置或扫描逻辑问题

    • 确认Contrast Agent为最新版本,旧版本对DWR的支持可能不完善;
    • 查看控制台中该漏洞的详细报告,确认Agent是否识别到你的CSRF令牌参数,是否因参数名不标准(如非csrfToken、_csrf)而判定无效,可尝试改用标准参数名;
    • 重新触发扫描,确保Agent捕获到修复后的请求样本。
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:34:54