浏览器安全
浏览器的安全策略有很多,比如同源策略,csp,cookie设置,以及浏览器沙箱等,都是游览器安全策略的内容。本文用于记录和理解这些设施,随时扩充,不断学习。
同源策略 (same-origin policy)
同源策略是浏览器最核心也最基本的安全功能。
内容:在同一个域内,客户端脚本可以任意读写同源内的资源,dom,cookie;但是在不同的域,就不能加载任何资源。即就是不同源的客户端脚本,在没有明确策略,不能访问和修改对方资源。
同源:协议,端口,域名三者都相同,称为一个域。
内容安全策略(content-security-policy)
通过编码在HTTP响应头中的指令来实施策略,用于指定前端网页加载资源的来源。在response中content-security-polity中。(白名单的方式)
Content-Security-Polity:script-src 'self' https://baidu.com
这句的意思是信任来源于百度域名的脚本和当前域名的脚本加载。
default-src
: 该指令在某种资源类型指定指令没有被定义的情况下制定了所有资源类型的加载策略(即默认的资源加载策略)
script-src
: 该指令指定了Web应用程序可以加载的脚本的域或URL
object-src
: 该指令制定了Web应用程序可以加载的插件,如Falsh
style-src
: 该指令制定了Web应用程序可以加载的CSS样式表的域或URL
img-src
: 该指令指定了Web应用程序可以加载的图片的域或URL
media-src
: 该指令指定了Web应用程序可以加载的音视频的域或URL
frame-src
: 该指令指定了Web应用程序可以加载的框架的域或URL
font-src
: 该指令指定了Web应用程序可以加载的字体的域或URL
connect-src
: 该指令指定了Web应用程序可以加载的像XHR, WebSockets, 以及EventSource等脚本接口的域或URL
plugin-types
: 该指令指定了哪些MIME类型的插件可以被加载(浏览器支持度不够)
form-action
: 该指令指定了HTML表单可以提交的URLS(浏览器支持度不够)
reflected-xss
: 该指令告诉浏览器开启或关闭任何用于过滤或组织反射跨站脚本攻击的启发式算法,这相当于X-XSS-Protection响应头的效果(浏览器支持度不够)
使用方式:
- 在前端页面
<meta>
中设置 - 在服务端设置
浏览器沙箱
黑客会在网页中插入一段恶意代码,然后利用浏览器漏洞来执行任意代码,这就叫做 挂马。它是浏览器所面对的一种主要的威胁。
浏览器为了应对 “挂马” 威胁,从单进程架构转变为多进程架构。浏览器的多进程架构,会分开浏览器的各个功能模块。这样当一个浏览器进程崩溃时,也不会影响到其他的浏览器进程。这个架构能容许多个程序同时运行而互不影响,每个网页标签都是独立于窗口程序而存在,当资源过高或崩溃时,不会因为一个停顿而整个程序当掉。这样做,可以极大地提升用户体验。
沙箱设计的目的是为了让不可信的代码运行在一定的环境中,从而限制这些代码访问隔离区之外的资源。如果因为某种原因,确实需要访问隔离区外的资源,那么就必须通过的指定的通道,这些通道会进行严格的安全检查,来判断请求的合法性。通道会采取默认拒绝的策略,一般采用封装 API 的方式来实现。
Chrome 浏览器包含浏览器进程、渲染进程、插件进程以及扩展进程。插件进程,比如 flash、java 等进程会与浏览器进程严格隔离。
Chrome 中的每一个标签页都是一个沙箱(sandbox)。为了防止“恶意软件破坏用户系统”或“利用标签页影响其他标签页”。沙箱遵循最小权限原则,每个动作的权限都会被限制,仅能运算而无法写入文件和从敏感区域(即受保护区域)读取文件(如我的文档、桌面)。例如在其中一个标签页运作的恶意软件,将无法窃取信用卡号码、干扰鼠标运作,或告诉系统在启动时运行某个程序,并且恶意软件会在标签页关闭时立即中止。
Cookie
cookie是能够让网站服务器把少量文本数据存储到客户端的硬盘,内存,或是从客户端硬盘,内存读取数据的一种技术。
因为HTTP协议是无状态的,web服务器无法区分请求是否来源于同一个浏览器。所以,web服务器需要额外的数据用于维持会话。cookie就用来跟随HTTP请求响应一起被额外传递的数据,用来维持会话和标识用户。
当你浏览某个网站的时候,该网站或许会向你的电脑写于一个非常小的文件,里面包含cookie信息,当下次浏览这个网站的时候,浏览器从该文件中提取cookie发送给网站,网站读取到cookie信息,得知你的相关信息,做出相应动作,比如:直接登陆,而无需输入用户名密码。
cookie按照存储的位置分为两种:内存cookie和硬盘cookie。内存cookie由浏览器维护,保存在内存中,浏览器关闭后就消失,存在时间短,而硬盘cookie保存在硬盘里,存在时期长。
一个用户电脑可以具有多个cookie,分别存储不同网站的信息,但是一个网站只能读取该网站本身放置在电脑的cookie,无法得知其他cookie信息。cookie大小最多也只能在4kb左右。
现在我在本地写了一个cs架构的登陆页面
这里的勾选记住用户在后端会向客户端写入cookie,而忘记用户则会将cookie删掉,现在我们抓包查看
此时,我们勾选了这个check,而服务器响应头中有了set-cookie字段,并向客户端写入了cookie
如果我们再次登陆,则会有:
我们的请求头中有了cookie字段,并且就是刚才服务器给我们客户端写入的两个cookie键值对,而在服务器端,检测到了我们的cookie值,对客户端做出响应,显示我们再次登陆。
我们用忘记用户来删除cookie,实际应用中,应该是退出登陆,
我选择忘记用户选项,我用来删除cookie的方式是重置cookie有效时间是一个过去的时间,那么cookie则会过期并且被删除,此时服务端响应头中正是设置cookie为一个过去时间。
以下为源码:(代码简陋,主要用于抓包分析)
前端:
1 | <html> |
后端:
1 | <html> |