后端Java开发如何防御XSS攻击

[[408226]]

跨站脚本攻击(XSS)可以让攻击者在受害者的浏览器中执行恶意脚本来修改网页内容、将用户重定向到非法网站、伪造用户登录态、窃取用户的隐私信息、甚至还能给程序开个后门等等,所以不得不防。今天就来分享几种常用的防范XSS攻击的措施。

XSS攻击

可能上面说的不够直观,下面我们来看一下XSS攻击的方式。假设我们写了一个注册用户接口:

  1. POST /user 
  2. Host: api.felord.cn 
  3. {  
  4.   "userId" : 1001,  
  5.   "username" : "felord.cn",  
  6.   "type" : "\<script\>alert(document.cookie)\</script\>"  

这样的用户如果查询出来并被渲染到前端时,type字段的值很容易被当做脚本执行,这是就是一种常见的XSS攻击。胖哥在刚刚入行的时候就遇到过,有人利用XSS挂他自己的广告到我们的网站中来牟取利益。我们需要在应用中做一些防御措施。

防范XSS攻击的手段

下面就是我比较常用的手段。

X-XSS-Protection请求头

X-XSS-Protection 响应头是 IE,Edge,Chrome 和 Safari 的一个特性,当检测到跨站脚本攻击 (XSS) 时,浏览器将停止加载页面。

  1. # 0 表示禁止XSS过滤  1 表示开启XSS过滤 
  2. X-XSS-Protection: 0 
  3. X-XSS-Protection: 1 
  4. # 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。 
  5. X-XSS-Protection: 1; mode=block 
  6. # 启用XSS过滤 (谷歌浏览器专用)。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。  
  7. X-XSS-Protection: 1; report=<reporting-uri> 

大部分浏览器都支持这一特性。

浏览器兼容性

可以看得出X-XSS-Protection的兼容性还是很好的,不过它的保护性比较弱。默认情况下,Spring security 会自动添加此请求头。

CSP请求头

上面已经提到了CSP,全称Content-Security-Policy(内容安全策略),它也是以请求头的形式存在。它允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(XSS)。它的控制粒度更细,它通过一系列的指令声明可以决定URL、多媒体资源、字体的加载策略、脚本的执行策略。具体可以查看Content-Security-Policy文档。

例如仅支持执行来自https://felord.cn的脚本:

  1. Content-Security-Policy: script-src https://felord.cn 

目前主流的浏览器也都支持该特性。

支持CSP的浏览器

在Spring Security中我们可以这样配置它:

  1. httpSecurity.headers() 
  2.     .contentSecurityPolicy(“script-src https://felord.cn”) 

编码过滤转义

除此之外我们还可以使用编码的形式来转义请求参数和响应体的字符来防止XSS攻击。这里会用到Spring提供的工具类org.springframework.web.util.HtmlUtils,当然Apache Commons也有类似的工具类。

  1. HtmlUtils.htmlEscape(String value) 

利用上面这个方法我们可以针对性的编写HttpServletRequestWrapper的实现来对请求参数进行转义:

  1. import org.springframework.web.util.HtmlUtils; 
  2.  
  3. import javax.servlet.http.HttpServletRequest; 
  4. import javax.servlet.http.HttpServletRequestWrapper; 
  5. import java.util.stream.Stream; 
  6.  
  7. public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { 
  8.  
  9.     public XssHttpServletRequestWrapper(HttpServletRequest request) { 
  10.         super(request); 
  11.     } 
  12.  
  13.     @Override 
  14.     public String getHeader(String name) { 
  15.         String value = super.getHeader(name); 
  16.         return HtmlUtils.htmlEscape(value); 
  17.     } 
  18.  
  19.     @Override 
  20.     public String getParameter(String name) { 
  21.         String value = super.getParameter(name); 
  22.         return HtmlUtils.htmlEscape(value); 
  23.     } 
  24.  
  25.     @Override 
  26.     public String[] getParameterValues(String name) { 
  27.         String[] values = super.getParameterValues(name); 
  28.         return values != null ? (String[]) Stream.of(values
  29.                 .map(HtmlUtils::htmlEscape).toArray() : 
  30.                 super.getParameterValues(name); 
  31.     } 
  32.  
  33. }  

结合 Servlet Filter 或者Spring MVC 拦截器。

编写JSON序列化来实现对JSON返回的转义,例如Jackson中自定义XSS序列化

  1. public class XssStringJsonSerializer extends JsonSerializer<String> { 
  2.  
  3.  @Override 
  4.  public Class<String> handledType() { 
  5.   return String.class; 
  6.  } 
  7.  
  8.  @Override 
  9.  public void serialize(String value, JsonGenerator jsonGenerator, 
  10.    SerializerProvider serializerProvider) throws IOException { 
  11.   if (value != null) { 
  12.    jsonGenerator.writeString(HtmlUtils.htmlEscape(value)); 
  13.   } 
  14.  } 

总结

今天介绍了几种常用的防止XSS攻击的方式,主要是涉及后端的。其实像一些现代的前端框架都支持将字符串变量转义,比如React的JSX。不过话又说回来,提高应用的安全的根本方法就在于降低攻击者的收益和提高攻击者的成本。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/130685.html<

(0)
运维的头像运维
上一篇2025-02-26 04:55
下一篇 2025-02-26 04:57

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注