我正在参加「掘金·启航计划」
1, 什么是xss攻击
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
2. 如何防范xss 攻击
1)基于特征的防御。XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同。这就给XSS漏洞防御带来了困难,不可能以单一特征来概括所有XSS攻击。
传统的XSS防御在进行攻击鉴别时多采用特征匹配方式,主要是针对“javascript”这个关键字进行检索,但是这种鉴别不够灵活,凡是提交的信息中各有“javascript”时,就被硬性的被判定为XSS攻击。
(2)基于代码修改的防御。Web页面开发者在编写程序时往往会出现一些失误和漏洞,XSS攻击正是利用了失误和漏洞,因此一种比较理想的方法就是通过优化Web应用开发来减少漏洞,避免被攻击:1)用户向服务器上提交的信息要对URL和附带的的HTTP头、POST数据等进行查询,对不是规定格式、长度的内容进行过滤。2)实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行。3)确认接收的的内容被妥善的规范化,仅包含最小的、安全的Tag(没有javascript),去掉任何对远程内容的引用(尤其是样式表和javascript),使用HTTP only的cookie。
当然,如上操作将会降低Web业务系统的可用性,用户仅能输入少量的制定字符,人与系统间的交互被降到极致,仅适用于信息发布型站点。并且考虑到很少有Web编码人员受过正规的安全培训,很难做到完全避免页面中的XSS漏洞。
3, Springboot 怎么实现对form 表单的 xss 过滤。
3.1 实现方式
这里我们使用spring mvc框架自带的参数绑定器, 目前只针对String类型的参数进行绑定, 对非法字符进行清除。
3.2 编写代码
新建一个springboot 的工程 , 里面添加web的依赖。 核心代码:
//表示对所有的Controller 进行拦截
@RestControllerAdvice
public class XssCleanConfig {
//表示对所有的 form 请求,String 类型的进行参数绑定,使用自定义的编辑。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new XssCleanEditor());
}
// 自定义的属性编辑器
public static class XssCleanEditor extends PropertyEditorSupport {
@Override
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text == null) {
setValue(null);
} else {
// 这里要使用xss 进行处理
// 我们这里就模拟上传的里面有javaScript ,在把他给过滤就行
if ( text.contains("javaScript") ) {
text = text.replace("javaScript","");
}
setValue(text);
}
}
}
}
3.3 编写测试
@PostMapping("/index")
public Person index(Person person) {
return person;
}
@Data
class Person {
private String name;
}
3.4 启动服务进行测试一下
完美
4, 怎么对某一个类的单个属性进行清理。json 格式提交
4.1 实现方式
因为现在使用的基本都是jackson 的序列化反序列化来进行消息转换器的实现。 我们只需要实现jackson 的注解里,自定义实现注解的实现类就行。
4.2 编写代码
public class XssCleanJackJson extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
if (jsonParser.hasToken(JsonToken.VALUE_STRING)) {
String text = jsonParser.getText();
if (text == null) {
return null;
}
//这里要使用xss 进行处理
// 我们这里就模拟上传的里面有javaScript ,在把他给过滤就行
if ( text.contains("javaScript") ) {
text = text.replace("javaScript","");
}
return text;
}
throw new RuntimeException("找不到对应的属性值");
}
}
4.3 编写单元测试
@PostMapping("/index")
public Person index(@RequestBody Person person) {
return person;
}
@Data
static class Person {
@JsonDeserialize(using = XssCleanJackJson.class)
private String name;
}
4.4 结果
完美