Fork me on GitHub

关于jsonp实现跨域访问,以及存在的安全问题

jsonp跨域访问的实现

  • 跨域的安全限制都是对浏览器端来说的,服务器端是不存在跨域安全限制的。
  • 浏览器的同源策略限制从一个源加载的文档或脚本与来自另一个源的资源进行交互。
  • 如果协议,端口和主机对于两个页面是相同的,则两个页面具有相同的源,否则就是不同源的。
  • 如果要在脚本里发起跨域请求,则要进行一些特殊处理了。例如,可以采用后台代理的方式,把请求发到自己的服务端,再通过后台代码发起请求,再将数据返回前端。
  • 一篇博客使用jquery的jsonp如何发起跨域请求及其原理进行了详细地介绍。

jsonp可能导致的安全问题

  • 了解了jsonp之后,可以看到,jsonp主要就是用来实现跨域的数据获取
  • 如果跨域的接口是暴露在公网上的,如果跨域接口是public级别,则无所谓安全问题,如果跨域接口是private级别,则必须对访问者做校验验证来访的Request的合法性的。目前已知的有Referer校验Token校验
Referer
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。
  • 这里通过对header中的访问发起者的来源进行验证来保证安全性,但是这个Referer是存在被绕过的可能的,绕过的主要原理就是“不发送Referer” ,如
    • 使用data URI方案
    • 从HTTPS向HTTP发起请求
Token
主要是指能代表用户身份的标识
  • 这个部分破解的难度较高,但是通过在运行非同源跨域的网站植入恶意代码,间接依靠“白名单”站点来获取Token发起跨域访问,可以同时绕过Referer和Token的问题,但是植入恶意代码的难度较高。

解决方案

  • 总的来说Referer和Token校验是标准,必须要使用的,可以解决常规安全问题最稳妥的是不使用jsonp,改用别的跨域方案(H5 提供的跨域方案postMessage、CORS、WebSocket)。
------ 本文结束 ------