SV.XSS.REF

跨站脚本 (Reflected XSS)

该错误表明应用程序数据库中存在跨站脚本。当未经检查的用户输入重新传递给 Web 接口时,会发生跨站脚本漏洞。

从 2023.2 版本开始,此检查器将支持 Jakarta EE。

漏洞与风险

在 Web 接口中使用的信息中使用未经检查的用户输入,会导致 XSS 或跨站脚本漏洞。该数据可能包含任意内容,比如 HTML 和 SCRIPT 标记。如果该信息显示给系统的其他用户,这些脚本可能被用于操纵用户的会话,将他们定向至其他网站,执行“钓鱼”攻击或运行其他恶意脚本内容。该漏洞在 Web 应用程序的留言板系统上很常见,在这里用户可能将信息发布给其他用户。必须对该内容进行严格屏蔽,以防止将 HTML 或 SCRIPT 标记注入到其他用户所看到的输出中。

Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。

缓解与预防

通常,可以通过验证所有来自应用程序外部的输入(用户输入、文件输入、系统参数等等)实现对跨站脚本漏洞的预防。验证应包括长度和内容。通常仅需要字母数字字符(即 A-Z、a-z、0-9)。应对任何其他接受的字符进行转义。尤其是对于 XSS 漏洞,用户输入中不得包含任何标记。应该在每个数据源处进行该验证,例如从 HTTP 请求读取每个参数时。应在服务器端进行验证,客户端验证不足以针对 XSS 提供保护,因为用户无需客户端浏览器便能够发送原始的 HTTP 数据包。

漏洞代码示例 1

复制
     import javax.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String action = req.getParameter("action");
         if ("chart".equals(action)) {
             renderChart(res.getOutputStream());
         } else if ("table".equals(action)) {
             renderTable(res.getOutputStream());
         } else {
             throw new ServletException("Cannot find action " + action);
         }
     }
 
     private void renderTable(ServletOutputStream outputStream) {
         //...
     }
 
     private void renderChart(ServletOutputStream outputStream) {
         //...
     }

Klocwork 在第 9 行报告 SV.XSS.REF 缺陷,指出:action 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 3 行)。该值用作第 9 行引发的 ServletException 的消息。将在浏览器中呈现该消息。这是一个反射式跨站脚本(Reflected XSS)漏洞:未经验证的用户输入被用于 Web 应用程序输出,其中可能包含任意的 HTML 和 JavaScript。

漏洞代码示例 2

复制
     import jakarta.servlet.http.*;
     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
         String action = req.getParameter("action");
         if ("chart".equals(action)) {
             renderChart(res.getOutputStream());
         } else if ("table".equals(action)) {
             renderTable(res.getOutputStream());
         } else {
             throw new ServletException("Cannot find action " + action);
         }
     }
 
     private void renderTable(ServletOutputStream outputStream) {
         //...
     }
 
     private void renderChart(ServletOutputStream outputStream) {
         //...
     }

Klocwork 在第 9 行报告 SV.XSS.REF 缺陷,指出:action 包含来自 HTTP 请求参数的数据,因此可能已被污染(第 3 行)。该值用作第 9 行引发的 ServletException 的消息。将在浏览器中呈现该消息。这是一个反射式跨站脚本(Reflected XSS)漏洞:未经验证的用户输入被用于 Web 应用程序输出,其中可能包含任意的 HTML 和 JavaScript。

相关检查器

安全培训

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

扩展

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