前端安全问题(XSS与CSRF)

1,303 阅读3分钟

虽然说前端涉及安全问题的情况相对于后端较少,但还是会有安全问题,主要是XSS和CSRF。

XSS (Cross Site Script) - 跨域脚本攻击

为了与层叠样式表(CSS)区分,所以Cross缩写为X而不是C

XSS的本质是破坏文档、代码的结构。使用的漏洞是程序没有对用户输入(可以是提交表单、也可以是url)的字符编解码,导致把用户输入的内容以代码形式输出到页面显示或执行。

很多人讨论XSS时会分为三种,DOM based XSS、存储型XSS、反射型XSS。然而,我觉得这种细分并不合适,DOM based XSS其实是从发生地点来决定,而存储型和反射型其实是从手段或者过程上来决定。

常见漏洞:

  1. 直接获取url参数来进行DOM插入、更新,甚至执行JS(eval、setTimeout、setInterval、new Function等)
  2. 直接获取用户输入的值进行DOM插入、更新,甚至执行JS(eval、setTimeout、setInterval、new Function等)
  3. 把未经编解码(处理)的用户输入提交到数据库存储;从数据库读取到输出到页面的过程中,也不进行编解码或替换。需要注意的是,不仅仅涉及HTML,连JS也是会有可能涉及的

解决方案:

  1. 避免使用innerHTML,使用JS创建节点的方式或使用模板
  2. 对特殊字符进行转义
特殊字符 转义字符
< &#60;
> &#62;
" &#34;
' &#39;
& &#38;
/ &#x2F;
  1. 严禁把url或用户输入的字符串作为代码执行
  2. 异步请求或表单提交参数时,对参数进行encoding(这是一个良好的习惯,无论是否针对XSS)
  3. 现代浏览器可以使用CSP(Content Security Policy)阻止非法资源(JS、CSS、iframe、图片、多媒体等)加载

宗旨:永不相信用户输入的信息!!!

   

CSRF (Cross Site Request Forgery) - 跨域请求伪造

CSRF的本质是利用网站使用cookie对用户进行验证的这一做法,诱骗用户访问有害的网页发送请求。

常见手法:

  1. 在网页上嵌入iframe、image、script等对目标网站发出GET请求进行数据处理(这更多是一个使用错误的请求方法的问题,GET方法本不应该进行除读取数据以外的操作)
  2. 在网页上提交form POST请求(可以是自动,也可以是诱骗用户点击)

解决方案:

  1. 只允许JSON API

AJAX请求和传统请求的区别是,请求头的X-Requested-With的值是XMLHttpRequest

  1. 不允许跨域请求或只允许可信域名请求

服务器的返回头添加Access-Control-Allow-Origin,设置为指定单个域名(含协议)或通配符*

  1. 服务器校验请求头的referrer

  2. 终极方案,使用CSRF token

 

 

 

 

 

延伸阅读

Understanding CSRF

MDN - HTTP访问控制(CORS)