跨域

# 同源策略

同源策略就是浏览器最基本的安全规则

## 什么是同源策略

同源策略/SOP(Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

## url地址的组成

协议 + 域名 + 端口(不写就是80) + path + hash + query

协议 + 域名 + 端口 有任意一个不同就会产生跨域

## 常见的协议

http://  基础的http协议

https:// 比http更加安全 (证书,公钥,私钥)

ws://    scoket及时通信

ftp://  文件传输协议

sftp://

## 同源策略的目的

同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。

设想这样一种情况:A网站是一家银行,用户登录以后,又去浏览其他网站。如果其他网站可以读取A网站的 Cookie,会发生什么?

很显然,如果 Cookie 包含隐私(比如存款总额),这些信息就会泄漏。更可怕的是,Cookie 往往用来保存用户的登录状态,如果用户没有退出登录,其他网站就可以冒充用户,为所欲为。因为浏览器同时还规定,提交表单不受同源政策的限制。

由此可见,"同源政策"是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

网址:http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html

##限制范围

随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。

(1) Cookie、LocalStorage 和 IndexDB 无法读取。

(2) DOM 无法获得。

(3) AJAX 请求不能发送。

##什么时候需要解决跨域

1.环境: 在前后端分离的项目中,前端开发前端工程 后端开发后端的接口,但是前后端需要接口联调,接口运行在后端的电脑(或者测试服务器上),前端在本地启动本地服务(localtion),需要通过ajax请求后端提供的接口地址(IP,域名),那么这个时候就需要解决跨域的问题(开发环境才会有跨域,生产环境不存在跨域问题)

2.开放api: 那么需要请求开放api(如果没有处理)也会遇到跨域的问题

3.小程序的开发: 小程序代码基于微信运行在客户端,接口是在服务器,那么这个时候请求接口就会遇到跨域的问题

4.子域名: 比如: www.baidu.com 请求api.baidu.com 这个时候无论是在本地,还部署到线上之后都会有跨域的问题

##解决跨域的方法

*jsonp

*代理

*cors

###jsonp

利用静态文件资源不跨域的特性解决跨域的问题

特性:因为浏览器的同源策略只是限制了ajax,并没有限制其他资源的请求,所以可以利用静态资源不跨域多的特性

#### 实现:


1.需要js动态生成script标签,并且赋值src为接口地址

2.动态创建一个函数添加到window上

3.将动态创建的函数的名称拼接到url地址的后面

4.服务端接收到请求,并且获取函数的名称

5.服务器返回正确的js语法,函数名(参数)

####优点:

1.没有兼容问题

2.能解决跨域

####缺点:

1.只有get请求

2.并不是真的ajax请求

3.不安全

####适用场景:

以前比较常用的一种跨域解决方案,或者兼容的开放api

####实现:

###代理

可以使用代理的方式解决跨域问题,代理分为(正向代理,反向代理),利用服务器不跨域的特性解决

###实现

1.webpack-dev-server  的proxy属性(正向代理)

proxy:{

  '/xxxx':{

    target:'http://location:3000',

    changeOrigin:true,

    pathRewrite:{'^/xxxx':''}

  }

}


2.nginx 可以实现 (反向代理)

###cors跨域资源共享

利用了w3c的新标准

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

###场景

1.网页

2.开发环境的时候 (正向代理)

####简介

CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。

整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。

因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。

####实例


####使用场景

1.多个子域名

2.小程序

你可能感兴趣的:(跨域)