文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-03 02:28

关注

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

XSS攻击

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

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

这样的用户如果查询出来并被渲染到前端时,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= 

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

浏览器兼容性

可以看得出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 { 
  2.  
  3.  @Override 
  4.  public Class 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。不过话又说回来,提高应用的安全的根本方法就在于降低攻击者的收益和提高攻击者的成本。

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

 

来源: 码农小胖哥内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯