何为XSS
XSS(cross-Site Scripting)跨站脚本攻击。是一种代码注入攻击,攻击者通过在目标网站上注入恶意脚本,使其在浏览器上运行。而浏览器是无法辨别哪些代码是可信的,就可能会导致恶意代码被执行。 常见的注入入口有:
1) 来自用户的UGC信息
2) URL参数
3) POST参数
4) Referer...
总之:任何用户输入的地方,都有可能成为XSS攻击的入口。
分类:
1) 存储型: 前端注入的代码,经过服务端,存入数据库形成的持久性攻击
2) 反射型: 前端注入的代码,进过服务端直接返回前端,不经过数据库
3) DOM型: 前端注入的代码,由于前端自己错误处理,形成的XSS攻击
其中DOM型XSS攻击取出和执行代码时在浏览器端完成的,属于前端自身的安全漏洞,其他两种是服务端的安全漏洞。
搞清楚了XSS攻击的危害,那么我们如何防御XSS攻击呢? 首先,从限制用户输入的角度的出发肯定是不行的,因为用户输入可能不通过网页呢?例如通过postman调用,所以我们应该从防止恶意代码被浏览器执行来着手。
1) 预防存储型和反射型XSS攻击:
1.1 采用前后端分离的方式进行开发,vue或者react渲染的时候就会明确告诉浏览器是html还是文
本。当然了,前后端分离存在SEO的问题。
2) 预防DOM型XSS攻击
1.1 使用框架的时候 避免使用v-html/dangerousSetInnerHTML;不要执行不可信的数据
何为CSRF
CSRF(Cross-site Request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中向被攻击网站发送跨站请求。
第三方网站可以利用img的src属性不受同源策略的限制,模拟发送get请求。同样的,也可以利用
form的action参数不受同源策略的影响,发送post请求。
CSRF同源检测:针对CSRF攻击,同源检测十分方便,而且很大程度上可以起到防御的作用。但是不同浏览器对于referer的处理是不一样的,有的浏览器甚至可以是没有referer的,这种把命运交给浏览器的做法还是不太好。
csrfToken防御CSRF攻击
CSRF攻击之所以能成功,是因为浏览器向一个域名发送请求会自动带上这个域名下的cookie。攻击者冒用了这个域名下的cookie,但是攻击者本质上就取不到这个cookie的具体数值的。所以在做身份验证的时候不能只验证请求的cookie,服务端应该在响应头中添加一个特殊字段,来校验访问者的身份,比如:token、authorization。
点击劫持
点击劫持又称为UI-覆盖攻击,通过引诱用户进行鼠标点击操作,但结果实际的操作却并不是用户的本意,所有被称为点击劫持。
http劫持
HTTP劫持是指http请求从浏览器到服务端的过程中,有中间节点对传输内容进行了窃听和篡改。
场景:当你使用公共wifi访问http机遇协议的网站的时候,在该协议上的所有操作都是可能会被这个公共wifi路由器的所有者所知道的,因为给予http协议的网站在转发的时候是可以被这个路由器劫持到的。
https = HTTP + SSL/TLS
对称加密:通常,将明文数据加密得到密文需要用到一把密钥,将密文数据解密称明文数据也需要用到一把密钥,对称加密的情况下,用于加密和解密的密钥相同。
存在的问题:加密的key如何安全传递?如果通过http协议传递又会存在http劫持的问题,这样还是无法解决问题。
非对称加密:用于加密和解密的密钥是两个不同的密钥,用其中一个密钥加密得到的密文,必须用另一个密钥才能解密。通常,其中一个不会对其他人公开的叫私钥,另外一把叫公钥。通常的非对称加密算法有RSA、DSA...
存在的问题:中间人可以在第一步,拦截服务器的公钥后把自己的公钥发给客户端,这样就可以在中间层解密客户端的数据,也就是说:客户端应该如何判断当前接受到的公钥就是服务端的公钥而不是别人伪造的呢?
数字证书: 证书机构中心CA:(Certificate Authority),专门为网站提供证明‘我是我’的认证机构。