【Java代码审计 | 第六篇】XSS防范

文章目录

XSS防范

使用HTML转义

在输出用户输入时,对特殊字符进行转义,防止它们被解释为HTML或JavaScript代码。

例如,使用StringEscapeUtils

java 复制代码
import org.apache.commons.text.StringEscapeUtils;

String userInput = request.getParameter("input");
String safeInput = StringEscapeUtils.escapeHtml4(userInput);  // 转义HTML
out.println(safeInput);

举个例子,以下是漏洞代码:

java 复制代码
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>XSS 测试</title>
</head>
<body>
<h1>在JavaScript中直接使用用户输入导致XSS</h1>
<form action="index.jsp" method="get">
  <label>请输入内容:</label>
  <input type="text" name="input">
  <button type="submit">提交</button>
</form>
<h2>输出结果:</h2>
<p>
  <%
    String userInput = request.getParameter("input");
    if(userInput != null){
      out.println("<script>var input = '" + userInput + "';</script>");
    }
  %>
</p>
</body>
</html>

代码直接将用户输入插入JavaScript中,导致XSS:

使用StringEscapeUtils进行转义可有效防止XSS:

java 复制代码
<%@ page import="org.apache.commons.text.StringEscapeUtils" contentType="text/html; charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>XSS 测试</title>
</head>
<body>
<h1>在JavaScript中直接使用用户输入导致XSS</h1>
<form action="index.jsp" method="get">
  <label>请输入内容:</label>
  <input type="text" name="input">
  <button type="submit">提交</button>
</form>
<h2>输出结果:</h2>
<p>
  <%
    String userInput = request.getParameter("input");
    String safeInput = StringEscapeUtils.escapeHtml4(userInput);  // 转义HTML
    if(userInput != null){
      out.println("<script>var input = '" + safeInput + "';</script>");
    }
  %>
</p>
</body>
</html>

JSP中可以使用JSTL的<c:out>标签实现转义:

jsp 复制代码
<c:out value="${param.input}" escapeXml="true"/>  <!-- 自动转义HTML -->

Thymeleaf框架能够自动转义:

html 复制代码
<p th:text="${input}"></p>  <!-- Thymeleaf默认会自动转义 -->

使用Content Security Policy (CSP)

CSP是一种浏览器安全机制,可以通过HTTP头来限制页面中可以执行的脚本来源,从而减少XSS攻击的风险。

java 复制代码
response.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'");

输入验证

对用户输入进行严格验证,确保其符合预期的格式和类型。例如,使用正则表达式检查输入是否为合法的电子邮件地址或电话号码:

java 复制代码
String userInput = request.getParameter("input");
if (!userInput.matches("[a-zA-Z0-9]+")) {
    // 输入不合法,拒绝处理
}

使用安全的库和框架

许多现代框架提供了内置的XSS防护机制。例如,Spring框架的HtmlUtils可以安全处理用户输入:

java 复制代码
import org.springframework.web.util.HtmlUtils;

String userInput = request.getParameter("input");
String safeInput = HtmlUtils.htmlEscape(userInput);  // 使用Spring的HtmlUtils进行转义
out.println(safeInput);

避免直接使用用户输入构建JavaScript代码

尽量避免将用户输入直接嵌入JavaScript代码中。如果必须这样做,应进行适当的转义。

java 复制代码
String userInput = request.getParameter("input");
String safeInput = StringEscapeUtils.escapeEcmaScript(userInput);  // 转义JavaScript
out.println("<script>var input = '" + safeInput + "';</script>");
相关推荐
AI人工智能+电脑小能手6 小时前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
不是光头 强6 小时前
Java 后端 AI 技术选型与学习路线
java·人工智能·学习
paopaokaka_luck7 小时前
基于springboot3+vue3的文山民族文化资源展示与推广平台(协同过滤算法、Echarts 图形化分析)
java·前端·spring boot·学习·echarts
eralong7 小时前
Java IO 与 NIO
java·后端
Jesse_EC7 小时前
我给消息推送加了 Publisher Confirm,然后亲手引入了一个竞态
java
S3rein8 小时前
JAVA多线程手撕
java·多线程
用户8181870627468 小时前
第7章 死锁排查实录:jstack定位死锁的完整流程
java·后端
刀锋00018 小时前
Java 工程师转 AI Agent 最短路径:用 Spring 的思维理解 Spring AI 2.0(附 LangChain4j 对照)
java·人工智能·spring boot·spring·ai agent
喵同志不止步于码农8 小时前
Java Caffeine 快速入门
java·开发语言·后端·并发·缓存一致性
Java成神之路-8 小时前
Java 并发灵魂拷问:notify/signal 唤醒顺序是规范还是实现?
java