今天主要复习了一些比较常见的网络完全的问题
XSS攻击
他主要的做法就是在页面上执行一段javascript,获取网站的信息,如cookie,他主要分几个类型:
反射型,如在img中的url是一段带<script>的代码;他主要是设计一个url来获取客户信息
保存型:
这种是脚本保存在数据库中,不经过滤就存储并显示给用户。实现这个过程主要分两步,先将恶意代码数据提交给服务器;然后服务器再将恶意代码返回给客户端,执行恶意代码;
-
基于DOM型:
攻击的过程可以用如下图来表示:
怎么防御:校验用户输入和校验Id类型,正则匹配; 在页面输出之前先进行转义,html编码,javascript编码;url编码; csp
有可能会出现攻击的几个点:
&号不应该出现在HTML的大部分节点中
括号<>是不应该出现在标签内的,除非是引号引入
在ext节点里面,<左尖括号有很大的危害
引号在标签内可能有危害,具体危害取决于存在的位置,但是在text节点是没有危害的。
CSRF
-
CSRF(Cross-site Request forgery)跨站请求伪造,他主要做的是,攻击者盗用你的登录信息,以你的身份模拟发送各种请求。
CSRF的攻击图:
从图中可以看出,要完成一次CSRF攻击,受害者必须完成两个步骤
登录受信任网站A,并在本地生成cookie
在不退出A的情况下,访问危险网站B。
需要满足这两个条件,才会收到CSRF的攻击,因为你不能保证以下情况不会发生
你登录了一个网站后,不再打开一个tab页面并访问另外的网站,特别是现在浏览器都是支持多tab的。
关闭本地的浏览器后,本地的Cookie不会立刻过期
上图中的攻击网站,可能存在一个存在其他漏洞的可信任的经常被人访问的网站
如何预防CRSF:
服务端预防: 正确使用GET、POST和Cookie; 在非GET请求中增加伪随机数;
随机数的增加主要有三个方式:
- 为每个用户生成一个唯一的cookie token,所有表单都包含同一个伪随机值
- 每个请求都是用验证码,这个方案完美,因为要多次输入验证码,所以用户友好性很差,所以不适合实际运用
- 不同的表单包含一个不同的伪随机值
3.HTTP劫持:主要是运营商,预防的方法是https
4.DNS劫持
HTML5的技术对网络安全的帮助
XMLHttpRequest Level 2 (Cross-origin Resource Sharing)
阮一峰的博格本地存储: 增加了local storage 和 session storage,使存储信息从cookie中走出来
web worker(js多线程执行): 因为执行js会阻塞UI,h5实现了web worker这一机制,从而使得js可以使用子线程去执行任务,不阻塞UI线程
web secket(服务器推送机制)主要是为了保持长链接
新标签和新API,比如<video>,<audio>,<canvas>使得可以少用第三方插件,减少不可控安全问题
(增强cookie的安全分方法: session cookie设置为true,创建cookie会被安全的形式向服务器传输,也就是在HTTPS连接中被浏览器传递到服务器端进行会话验证,如果是HTTP连接就不会传递信息,所以不会被窃取到Cookie的具体内容; HttpOnly属性,如果设置了HttpOnly属性,那么通过脚本将无法获取到Cookie信息,这样能有效的防止XSS攻击)
AJAX 跨域资源共享(CORS)
因为ajax是严格遵守同源策略的,所以诞生了ajax跨域方式的-CORS,就是为了解决跨域问题;除了这种方法以外,还有两种其他方式:jsonp的方式和flash跨域方案
CORS跨域的做法:用Access-Control-Allow-Origin这个头以及其他的头来实现的,客户端跨域访问另一个服务器,服务器会确定这个域名是否有权限来获取资源,若有则返回一个带有Access-Control-Allow-Origin头的response以及资源,若无则返回一个权限错误:XMLHttpRequest;
但是这个做法的风险点
http头信息可以伪造,说明头信息中的域名origin可以是假的,所以跨域是要配合身份验证进行的,所以跨域要带上session id;
就算带上了session id,但第三方还是可能会入侵,导致源站信息泄露,所以CORS是个非常危险的东西;
内部信息泄露,内部成员打开了一个evil website, 导致信息泄露,内部网站的数据也将泄露;
设置了Access-Control-Allow-Origin,并对请求点做了请求控制,但是返回权限错误的时候,请求信息已经到了客户端;
CORS默认不携带会话信息,但是如果withCredentials设置为true,就可以携带,所以最好不要设置为false.万一设置为true,请在Access-Control-Allow-Origin上设置具体的域名,不要使用*。
防御姿势:
不要对Access-Control-Allow-Origin设置*
对跨域要验证session信息
严格审查请求信息,比如请求蚕食,还有http头信息
所以应该怎么使用:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。