主流web前端安全需要防范的点

概述

我们的web应用项目分为两类,只内网可访问项目和外网可访问项目,内网项目因为有防火墙策略,可以暂缓对前端安全的审查,但外网项目需要注意很多前端安全风险,这些风险会被黑客利用,轻则篡改网页内容,重则窃取网站内部数据,更为严重的则是在网页中植入恶意代码,使得用户受到侵害。常见的安全漏洞如下:

  • XSS 攻击:对 Web 页面注入脚本,使用 JavaScript 窃取用户信息,诱导用户操作。
  • CSRF 攻击:伪造用户请求向网站发起恶意请求。
  • 钓鱼攻击:利用网站的跳转链接或者图片制造钓鱼陷阱。
  • HTTP参数污染:利用对参数格式验证的不完善,对服务器进行参数注入攻击。
  • 远程代码执行:用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。

值得注意的是,这些安全隐患虽然是从前端发起攻击,但实质的防范是需要后端的协助,一般后端框架本身会提供集成方案来解决这些风险,如Spring Security,我们以团队主流的框架spring boot为例,自检是否有被注意到(因为我并不会java,但会其他后端技术,因为原理是一样的,框架的实现也都是大同小异的,所以按照我提供的方案去找下你们自己框架的,肯定是可以直接用的直接用的方法配置的)。

安全威胁XSS的防范

简介

XSS(cross-site scripting跨域脚本攻击)攻击是最常见的 Web 攻击,其重点是『跨域』和『客户端执行』。
XSS 攻击一般分为两类:

  • Reflected XSS(反射型的 XSS 攻击)
  • Stored XSS(存储型的 XSS 攻击)
    对XSS攻击的防范,核心是转义,使XSS攻击代码失效。

反射型 XSS 及其防范

反射型的 XSS 攻击,主要是由于服务端接收到客户端的不安全输入,在客户端触发执行从而发起 Web 攻击。比如:

在某购物网站搜索物品,搜索结果会显示搜索的关键词。搜索关键词填入<script>alert('handsome boy')</script>, 点击搜索。页面没有对关键词进行过滤,这段代码就会直接在页面上执行,弹出 alert。

防范措施

特殊字符进行转义操作,例如将 < > /等特殊字符转换成html支持的 < >等,这样显示到页面的时候还是那些内容但是不会当成脚本执行了。
这种方式我们用到了SpringFramework自带的HtmlUtils.htmlEscape方法进行替换。

存储型 XSS 及其防范

基于存储的 XSS 攻击,是通过提交带有恶意脚本的内容存储在服务器上,当其他人看到这些内容时发起 Web 攻击。

最主要的传参方式之一的表单交互,对参数进行过滤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package cn.pconline.pcloud.admin.config;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter(filterName = "xssFilter", urlPatterns = "/*", asyncSupported = true)
public class XssFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req);
chain.doFilter(xssRequestWrapper, response);
}

@Override
public void destroy() {

}
}

考虑到在现在的开发中,更多的是使用json类型做数据交互,所以对json的过滤也是必不可少的,这里是通过修改SpringMVC的json序列化来达到过滤xss的目的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.apache.commons.text.StringEscapeUtils;
import java.io.IOException;
public class XssStringJsonSerializer extends JsonSerializer<String> {
@Override
public Class<String> handledType() {
return String.class;
}
@Override
public void serialize(String value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
if (value != null) {
String encodedValue = StringEscapeUtils.escapeHtml4(value);
jsonGenerator.writeString(encodedValue);
}
}
}

JSONP XSS

JSONP 的 callback 参数非常危险,他有两种风险可能导致 XSS

  • callback 参数意外截断js代码,特殊字符单引号双引号,换行符均存在风险。
  • callback 参数恶意添加标签(如