同源策略:
影响源的因素有host(域名或IP地址,如果是IP地址则看作一个根域名)、子域名、端口、协议;
在浏览器中,<script>,<img>,<iframe>,<link>等标签都是可以跨域加载资源,不受同源策略影响,
这些带"src"属性的标签每次加载时,实际上是有浏览器发起一次GET请求;
XMLHttpRequest通过src属性加载的资源,浏览器限制了JavaScript的权限,使其不能读,写返回的内容;它可以访问来自同源对象的内容,但不能跨域访问资源;(若可以跨域访问,则会导致CSRF的token泄露);
HTTP头对于JavaScript来说一般是无法控制的,它可以通过HTTP头授权是否允许跨域访问;
以flash为例,它主要通过目标网站提供的crossdomain.xml文件判断是否允许当前”源“的flash跨域访问资源;
以www.qq.com的策略文件为例,当浏览器在任意其他域的页面里加载了flash后,如果对www.qq.com发起访问请求,flash会先检查www.qq.com上此策略是否存在;如果文件存在,则检查发起请求的域是否在许可范围内;
在这个策略文件中,只有来自*..qq.com和*.gtimg.com域的请求是被允许的;
在flash9及其以后版本中,还实现MIME检查确认crossdomain.xml是否合法,如查看服务器返回HTTP头部的Content-Type是否是text/*、application/xml、applicaton/xhtml+xml。(xml配置文件,用于过滤HTTP返回头部是否合法,xml能把数据和HTML页面进行分离),除了MIME检查外,flash还会检查crossdomain.xml是否在根目录下,可以使得一些文件上传的攻击失效;
浏览器的多进程架构使得浏览器的各个功能模块分开,各个浏览器实例分开,当一个进程崩溃时,也不会影响其他进程;
google chrome浏览器是第一个采取多进程架构的浏览器,google chrome 的主要进程分为:浏览器进程,渲染进程,插件进程,扩展进程。插件进程如Flash,java,pdf等与浏览器进程严格隔离,因此不会互相影响;
渲染引擎由Sandbox隔离,网页代码要与浏览器内核进行通信、与操作系统通信都需要通过IPC channel,在其中会进行一些安全检查;
Sandbox即沙箱,为了让不可信任的代码运行在一定的环境中,限制不可信任的代码访问隔离区之外的资源;如果一定要跨越Sandbox边界产生数据交换,则只能通过指定数据通道,比如经过封装的API来完成,在这些API中会严格检查请求的合法性;(沙箱可以对用户提供的代码进行隔离,防止用户代码破坏系统(如SQL注入,跨站脚本攻击))沙箱可以针对本地文件系统、内存、数据库、网络的可能请求,可以采取默认拒绝的策略,对于有需要的请求,可以通过封装API的方式实现;
IE浏览器 IE8中,通过XSS filter修改用户访问URL中包含XSS攻击的脚本的关键字;
firefox中,有服务器端返回一个HTTP头,并在其中描述页面应该遵守的安全策略;(这是由于XSS攻击在没有第三方插件的帮助下,无法控制HTTP头)使用CSP方法,插入一个HTTP返回头,浏览器将信任来自mydomain.com及其子域名下的内容;
即浏览器除了信任自身来源外,还可以加载任意域的图片,来自medial.com的媒体文件,以及userscripts.example.com的脚本,其他一律拒绝;