bibi7 / fe-daily-increase

一个记录开发日常和奇奇怪怪的点的repo
MIT License
5 stars 0 forks source link

xss #59

Open bibi7 opened 4 years ago

bibi7 commented 4 years ago

什么是xss?

XSS 全称是 Cross Site Scripting(即跨站脚本),或者说更为通用的我们可以理解成为恶意代码注入。 根据不同的注入方式,xss一般来说常见到的有两种。分别是存储型反射型

存储型

存储型,顾名思义就是将恶意脚本存储了起来,确实,存储型的 XSS 将脚本存储到了服务端的数据库,然后在客户端执行这些脚本,从而达到攻击的效果。 常见的场景是留言评论区提交一段脚本代码,如果前后端没有做好转义的工作,那评论内容存到了数据库,在页面渲染过程中直接执行, 相当于执行一段未知逻辑的 JS 代码,是非常恐怖的。这就是存储型的 XSS 攻击。

反射型

反射型的话,一般是作为网络请求的一部分。正常情况下也会出现在url中(曾经我司安全部就给我提了这么一个bug) 之所以叫它反射型, 是因为恶意脚本是通过作为网络请求的参数,经过服务器,然后再反射到HTML文档中,执行解析。和存储型不一样的是,服务器并不会存储这些恶意脚本。

比如有这么一串url

https://ljbao.lu.com/yeb/820/trading/trade-info/143904672?amount=1.02&sid=507264088"/><img src=1 onmouseover=alert(123)>&isFirstInvest=false&need=trading

这样在html中,html解析到了这个标签且会插入在文档流中,当鼠标略过图片的时候,注入的js就会被触发。

保险起见,不管是前端还是后端都要对用户的输入做校验。比如可以在controller层过滤一下url

import org.apache.commons.lang.StringEscapeUtils;

private String format(String str){
  return StringEscapeUtils.escapeHtml(str);
}

@RequestMapping(value = "trading/trade-info/{productId:[0-9]+}", method = RequestMethod.GET)
  public String traddingInfo(@PathVariable("productId") String productId,
  ModelMap model) throws InvokeRemoteServiceException {

  //........
  Map<String,Object> investmentInfo = investDetailService.getInvestmentInfoInit(productId, xxx, xxx);
  model.put("investmentInfo", investmentInfo);
  model.put("productId", format(productId));
  //........
}