SV.CSRF.TOKEN

此错误可标识出无法根据所存储的 CSRF 令牌验证传入请求的状态变化请求处理程序。

漏洞与风险

跨站点请求伪造 (CSRF) 是一种发生在以下情况下的攻击类型:恶意网站、电子邮件、博客、即时消息或程序导致用户的 Web 浏览器在用户当前经过身份验证的受信任站点上执行并非所需的操作。

减轻 CSRF 漏洞造成的危害的标准方法是使用同步程序令牌。经加密的安全随机令牌仅与用户会话相关联,可作为隐藏字段添加到任何导致状态变化操作的表单中。如果 CSRF 令牌验证失败,服务器会拒绝所请求的操作。

代码示例

漏洞代码示例 1

复制
    void doPost(HttpServletRequest req, HttpServletResponse resp) {
        String action = req.getParameter("action");
        String id = req.getParameter("id");
    
       if("update".equals(action)){
           updateUser(id, req);
       }
       //...
   }

   void updateUser(String userid, HttpServletRequest req) {
       //...
   }

在第 6 行报告了 SV.CSRF.TOKEN:从未针对可能的跨站点请求伪造攻击检查“req”。该处理程序应确认在更改应用程序状态之前请求是否包含有效的 CSRF 令牌。

修正代码示例 1

复制
    void doPost(HttpServletRequest req, HttpServletResponse resp) {
        if
    (req.getParameter("_csrf_token").equals(req.getSession().getAttribute("_csrf_token"))) {
            String action = req.getParameter("action");
           String id = req.getParameter("id");
 
           if ("update".equals(action)) {
               updateUser(id, req);
           }
           //...
       }
   }

   void updateUser(String id, HttpServletRequest req) {
       //...
   }

更新的代码在修改应用程序状态之前验证请求。如果请求所提交的令牌与用户会话中所存储的令牌不匹配,将会拒绝该请求。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 Java 分析。