Cookie
Cookie是什么
Cookie(会话跟踪技术),是小量信息数据,由网络服务器发送出来以存储在网络浏览器上,当下次再回到该网络服务器时,可从该浏览器读回此信息。
一个网站从打开到浏览(包括这个网页的其他子页面)到最后关闭浏览器整个过程叫一个“会话”
为什么要用Cookie
- web程序是使用HTTP协议传输的,而HTTP协议是无状态的协议,对于业务处理没有记忆能力。缺少状态意味如果后续处理需要前面的信息,则必须重传,这样导致每次传送的数据量增大。
- 在服务器不需要先前信息时它的应答比较快。
Cookie的属性
- 基于HTTP/HTTPS协议的技术,不支持本地file文件对cookie的操作。
- 只能使用文本。
- 单条存储有大小限制4KB。
- 数量限制(一般浏览器,限制在50条左右)。
- 读取有域名限制,不可跨域读取,只能由来自写入cookie的同一域名的网页可进行读取。
- 时效限制,每个Cookie都有时效,最短的有效期是会话级别:当浏览器关闭,Cookie立即销毁。
设置Cookie的方式
Cookie的优化
- 去除无用的Cookie,如果网页不需要Cookie就完全禁掉。
- 将Cookie的大小减到最小,Cookie在访问对应域名下的资源时都会通过HTTP请求发送到服务器。因此,减小Cookie的大小,能减小HTTP请求报文的大小,提高响应速度。
- 设置合适的过期时间,较长的过期时间可以提高响应速度。给cookie添加一个过期时间,则cookie信息将存储到硬盘上,即使浏览器退出Cookie还会存在。只要Cookie未被清除且还在过期时间内,该Cookie就会在访问对应域名时发送给服务器。
- 通过使用不同的domain减少cookie的使用。
cookie在访问对应域名下的资源时都会通过HTTP请求发送到服务器,但在访问一些资源,如js,css和图片时,大多数情况下cookie是多余的,可以使用不同的domain来存储这些静态资源,这样访问这些资源时就不会发送多余的cookie,从而提高响应速度。
cookie隔离:如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量,所以不如隔离开。因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据,这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延时的目的。同时这种方式不会将cookie传入Web Server,也减少了Web Server对cookie的处理分析环节,提高了webserver的http请求的解析速度。
XSS
XSS攻击原理
XSS(Cross Site Script 跨站脚本攻击),包括反射性XSS、持久性XSS、DOM based XSS,其原理是攻击者向有XSS漏洞的网站中输入恶意的 HTML 代码,当用户浏览该网站时,这段 HTML 代码会自动执行,从而达到攻击的目的。XSS 攻击类似于 SQL 注入攻击,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。 XSS是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式。
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。在部分情况下,由于输入的限制,注入的恶意脚本比较短。但可以通过引入外部的脚本,并由浏览器执行,来完成比较复杂的攻击策略。
例如: 在input框中输入
如何避免XSS
- XSS 攻击的预防主要是对输入(和URL参数)进行过滤,对输出进行编码,将容易导致XSS攻击的边角字符替换成全角字符
- 对输出进行编码,在输出数据之前对潜在的威胁的字符进行编码、转义是防御XSS攻击。
CSRF
CSRF攻击原理
CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。登录安全受信任的网站A,并在本地生成Cookie,在访问A的情况访问危险的网站B,网站B接受用户请求后返回攻击性代码,网站A在用户不知情的情况下携带Cookie信息,当用户C访问的时候,B网站的恶意代码被执行。
如何避免CSRF
CSRF漏洞防御主要可以从三个层面进行,即服务端的防御、用户端的防御和安全设备的防御。
- 验证HTTP Referer字段、在请求地址中添加token并验证、 在HTTP头中自定义属性并验证
- CSRF攻击是有条件的,当用户访问恶意链接时,认证的cookie仍然有效,所以当用户关闭页面时要及时清除认证cookie,对支持TAB模式(新标签打开网页)的浏览器尤为重要。
- 尽量少用或不要用request()类变量,获取参数指定request.form()还是request. querystring (),这样有利于阻止CSRF漏洞攻击,此方法只不能完全防御CSRF攻击,只是一定程度上增加了攻击的难度。
跨域
为什么要跨域
为了网络安全起见,浏览器设置了一个同源策略,规定只有域名,端口,协议全部相同,就叫做同源。当页面在执行一个脚本时,会检查访问的资源是否同源,如果不是,就会报错。可是在实际开发中,经常会有跨域加载资源的需求,避免不了跨域请求,所以就出现了跨域。
同源策略的目的:为了保证用户信息的安全,防止恶意的网站窃取数据。
有什么跨域场景
端口不同、域名不同、协议不同。
同源策略限制的具体表现
(1)coikie、LocalStorage和Index DB 无法读取
(2)Dom 无法获得
(3)AJAX请求不能发送
跨域方案
- JSONP – 原理就是利用了script标签,在标签外套了一层壳,利用标签特性达到跨域加载资源的效果。
JSONP由两部分组成,回调函数和数据
优点:
(1)兼容性好,在多古老的浏览器都能运行。
(2)能直接访问响应文本,支持在浏览器与服务器之间双向通信。
缺点:
(1)只支持GET请求,不支持POST请求;
(2)不够安全。因为JSONP是从其他域中加载代码执行,如果其他域不安全,可能会在响应中带有恶意代码。
(3)不容易确认请求是否失败。 - CORS – 跨站资源共享,它是跨域的官方解决方案,升级版的JSONP。原理是使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是失败。请求和响应都不包含cookie信息。
CORS需要浏览器和后院同时支持,浏览器会自动进行CORS通信,实现CORS通信的关键是后端,只要后端实现了CORS,就实现了跨域,服务端设置Access-Control-Allow-Origin 就可以开启CORS,该属性表示哪些域名可以访问资源,如果设置通配符则表示所有网站都可以访问资源。 - webSockets – 不受同源策略影响。原理是因为它不使用HTTP协议,而使用一种自定义的协议,专门为快速传输小数据设计。
- Nginx – 代理跨域。反向代理跨域。
- Proxy