Java web中如何防止xss 注入呢?
首先讨论第一个问题:存到数据库中的是转码之后的还是转码之前的?
转码之后:
转码之前:
结论是:存到数据库中的就是转码之前的.为什么呢?
因为xss 攻击只存在PC web端,如果数据库中存储的就是转码之后的,那么手机app显示出来不就有问题了么?
所以最终的做法就是在PC web端 转码:
转码方法:
escape= function (str) { str = str ? str : ''; return str.replace(/</g, "\x26lt;").replace(/>/g, "\x26gt;").replace("/\x26/g", "\x26amp;").replace(/"/g, "\x26quot;"); }; unescape= function (str) { str = str ? str : ''; return str.replace(/</g, "\x3c").replace(/>/g, "\x3e").replace(/&/g, "\x26").replace(/"/g, '"'); };
注意:
在Java 后台也不要转码,只在PC web端转码,而且只在显示用户输入的字段时转码
实际案例
用户名中包含单引号就报错:
按道理, <#escape x as x?html>就是用于解决xss攻击的,
可以把单引号转化为:'
可是没有!!!
解决方法:
在服务器端对单引号进行转义:
public static String escapeUserName(String name){
return name.replace("'", "\\'");
}
这就是<#escapex as x?html>的坑