XSS 攻击
反射性跨站脚本攻击
介绍
攻击者将含有恶意脚本的URL发送给用户,用户打开URL对应得页面时,浏览器执行URL中的脚本,浏览器执行恶意脚本。
攻击者可以用此方法窃取用户Cookie。
例如如下代码:
<div>
<img src="/images/handler.ashx?id=<%=Request.QueryString["id"] %>" />
</div>
当攻击者引诱用户执行如下URL时
http://www.xxx.com/?id=" /><script>alert(/xss/)</script><br x="
反射出的HTML代码如下:
<div>
<img src="/images/handler.ashx?id=" /><script>alert(/xss/)</script><br x="" />
</div>
解决方法
- 在表单提交或者URL参数传递前,对参数进行过滤
- 过滤用户输入的内容
存储型跨站脚本攻击
介绍
攻击者利用web应用程序提供的录入或修改数据的功能,将恶意脚本存入服务器或者用户cookie中,当用户浏览该数据页面时,页面中嵌入的恶意脚本就会执行。
解决办法
- 后端过滤表单提交的参数
- 前端转义、过滤处理
DOM跨站脚本攻击
介绍
- html页面中定义了js代码,要求根据用户的输入不同,执行不同的html代码,攻击者可以在输入时,插入一段恶意脚本,执行html代码时会执行恶意脚本。
- DOM跨站是纯脚本的输出,只有规范使用JavaScript才可以防御。
我们的项目中解决方案
import com.XXX.platform.utils.AntiXssUtil
AntiXssUtil.decodeHtml(AntiXssUtil.cleanHtml(String))
CSRF(Cross-site request forgery)跨站请求伪造
介绍
CSRF是通过伪装受信用用户的请求来利用受信任的网站。
解决方法
- 服务端对提交页面进行Referer的合法性验证
- 规范请求类型
- 设置请求Token
项目中代码(使用的第一种方法):
private boolean allow(PlatformController controller, HttpServletRequest request) {
String refererHost = WebUtil.getHostOfUrl(WebUtil.getReferer(request));
if (StringUtil.isEmpty(refererHost)) {
return false;
} else {
return StringUtil.equals(WebUtil.getHost(request), refererHost) ? true : controller.isSafeHost(refererHost);
}
}