距离上一次介绍XSS与CSRF已通过去了漫长了两个月,工做较忙,文章姗姗来迟。
小小回顾一下究竟什么是XSS和CSRF:https://segmentfault.com/a/11... 《用大白话谈谈XSS与CSRF》。php
那么,咱们来谈谈如何防范它。
CSRF依赖于XSS,防住XSS基本也就防住了CSRF让咱们明确咱们的目的,其实就是不让用户踏入XSS的坑,那咱们有两个方法防止用户入坑,一个是对外部输入进行不折不扣的敏感字符过滤,一个是在显示的时候作一些特殊处理不让敏感代码顺利执行。
前者主要由前端与后端协力完成,后者的话一般就是由前端单独去完成的。html
理论上只要有输入数据入口的地方,XSS漏洞就会存在,js代码能够由各类各样的模式注入到数据库中(明文或者编码),因此在中小项目中咱们先明确一个意识便可,咱们开发人员要有安全处理的意识,不求百分百的过滤掉非法字符,可是基本的,常见的过滤掉便可,剩下的就交给安全工程师去作吧。前端
中心思想:一切的一切外部来源数据,毕竟通过咱们服务端代码的过滤,才能让他展现到页面上,也就是说,一切外部数据都是非法的,必定要作好过滤,尤为是WEB端。(毕竟各类js防不胜防)。
因此像如下这种直接把页面掌控权交给了用户的代码,是绝对不能写的:数据库
<?php $name = $_GET["name"]; $name = htmlspecialchars($name); ?> <input type='text' value='<?php echo $name?>'>
下面的案例用世界上最好的语言来演示:segmentfault
非法字符有两类,明文:<script>alert('我是xss,你有麻烦了')</script>,这样的明文传到服务端,若是让他就这么入库的话,咱们的数据库就被XSS注入了,因此咱们须要对明文的很好过滤,htmlspecialchars后便可把script标签过滤成安全字符 <script> ,那么明文的能够简单的就过滤掉了。后端
明文易档,编码难防,浏览器
编码:u0026u006cu0074u003bu0073u0063u0072u0069u0070u0074u0026u0067u0074u003bu0061u006cu0065u0072u0074u0028u0026u0023u0033u0039u003bu6211u662fu0078u0073u0073uff0cu4f60u6709u9ebbu70e6u4e86u0026u0023u0033u0039u003bu0029u0026u006cu0074u003bu002fu0073u0063u0072u0069u0070u0074u0026u0067u0074u003b
安全
若是不怀好意的人不用明文,却用这种unicode方式,那么垂手可得就能够越过htmlspecialchars的防守,而后入库,而后展现的时候html编码会将这种unicode自动转回明文(也就是变成真实的注入代码),危害就来了!服务器
同比类推,既然unicode能够充当注入的工具,那么其余编码我相信也是能够的。因此在这里也强调一下尽可能将页面的字符编码设置为unicode(utf-8),而后咱们统一处理unicode编码注入和明文注入的状况就好
以上注入代码只是简单的注入并不会有实质危害,可是若是是相似于document.cookie这类获取隐私cookie,而后把这段cookie发送到外部服务器存储起来,那么在这段cookie的有效期内,我能够直接拿这份cookie去登陆帐号了!cookie
如何防范以上这些恐怖的事情呢?回来开头我说的,输入过滤,输出过滤:
看到了在 @月之领主LM 在他的问题中已经总结了,那我就直接站在巨人的肩膀上吧!
PHP直接输出html的,能够采用如下的方法进行过滤: 1.htmlspecialchars函数 2.htmlentities函数 3.HTMLPurifier.auto.php插件 4.RemoveXss函数(百度能够查到) PHP输出到JS代码中,或者开发Json API的,则须要前端在JS中进行过滤: 1.尽可能使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容 2.必需要用innerHTML等等函数,则须要作相似php的htmlspecialchars的过滤(参照@eechen的答案) 其它的通用的补充性防护手段 1.在输出html时,加上Content Security Policy的Http Header (做用:能够防止页面被XSS攻击时,嵌入第三方的脚本文件等) (缺陷:IE或低版本的浏览器可能不支持) 2.在设置Cookie时,加上HttpOnly参数 (做用:能够防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6) (缺陷:网站自己的JS代码也没法操做Cookie,并且做用有限,只能保证Cookie的安全) 3.在开发API时,检验请求的Referer参数 (做用:能够在必定程度上防止CSRF攻击) (缺陷:IE或低版本的浏览器中,Referer参数能够被伪造)
固然,这一块的安全处理也只能处理冰山一角,我相信仍是有其余方式能够进行xss注入攻击的,可是实际上做为开发人员我认为,咱们只要拦截了大部分常见攻击便可了。
平常开发中须要带有安全意识,WEB端或者APP服务端都不信任外部的任何输入,任何!
参考文章 :
https://www.owasp.org/index.p...《XSS (Cross Site Scripting) Prevention Cheat Sheet 》
http://www.cnblogs.com/yangxi...《【前端安全】JavaScript防http劫持与XSS》
https://segmentfault.com/q/10...《PHP的防护XSS注入的终极解决方案【信息安全】【Hack】》