XSS
XSS(Cross Site Scripting) 跨站脚本攻击,攻击者插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
运行
漏洞代码
@GetMapping("/reflect") public static String input(String content) { return content; }
运行
安全代码 - htmlEscape方法
import org.springframework.web.util.HtmlUtils; @GetMapping("/safe1") public static String safe1(String content) { return HtmlUtils.htmlEscape(content); }
编码建议
【必须】外部输入拼接到response页面前进行编码处理 当响应“content-type”为“html”类型时,外部输入拼接到响应包中,需根据输出位置进行编码处理。
运行
安全代码 - 自定义过滤
private static String XssFilter(String content) { content = StringUtils.replace(content, "&", "&"); content = StringUtils.replace(content, "<", "<"); content = StringUtils.replace(content, ">", ">"); content = StringUtils.replace(content, "\"", """); content = StringUtils.replace(content, "'", "'"); content = StringUtils.replace(content, "/", "/"); return content; }
运行
安全代码 - 黑白名单
import org.jsoup.Jsoup; import org.jsoup.safety.Whitelist; public static String safe3(String content) { Whitelist whitelist = (new Whitelist()) .addTags("p", "hr", "div", "img", "span", "textarea") // 设置允许的标签 .addAttributes("a", "href", "title") // 设置标签允许的属性, 避免如nmouseover属性 .addProtocols("img", "src", "http", "https") // img的src属性只允许http和https开头 .addProtocols("a", "href", "http", "https"); return Jsoup.clean(content, whitelist); }