2010-10-06 62 views
9

我有一个脚本,使用JSONP进行跨域Ajax调用。这很好,但我的问题是,有没有办法阻止其他网站访问并从这些URL获取数据?我基本上想要列出允许的网站列表,并且只有在列表中才返回数据。我正在使用PHP,并且我可能会使用“HTTP_REFERER”,但读过一些浏览器不会发送这些信息....有任何想法吗?保护JSONP?

谢谢!

+6

另外'REFERRER'可以被伪造 – 2010-10-06 15:13:23

回答

6

确实没有有效的解决方案。如果您的JSON可以通过浏览器访问,那么其他网站也可以访问它。对于Web服务器来说,源自浏览器或其他服务器的请求实际上与标题不同。像ILMV评论说的,引用者(和其他头文件)可能是伪造的。他们毕竟是自我报告的。

安全永远不会完美。一个有足够决心的人可以克服任何安全措施,但是安全的目标是创造足够高的威慑力,以阻止非专业人士和/或大多数人投入必要的时间和资源来危及安全。

考虑到这一想法,您可以创建一个足够高的入口门槛,以便其他站点可能不会打扰进入壁垒的请求。您可以生成抓取json数据所需的单次使用令牌。一旦令牌被用来获取json数据,该令牌随后会失效。为了检索令牌,必须使用JavaScript中的页面嵌入令牌来请求网页,然后将该令牌放入json数据的ajax调用中。将此与时间到期的标记相结合,并在JavaScript中进行充分的混淆处理,并创建了足够高的屏障。

只要记住,这是不可能的规避。另一个网站可以从javascript中提取出令牌,并拦截ajax调用并在多个点上劫持数据。

+0

+1个单用途标记 – mattbasta 2010-10-16 15:22:18

0

您是否有权访问您想要访问JSONP的服务器/站点?

你可以做什么,虽然不理想的是在允许查看JSONP的页面加载中向IP数据库添加记录,然后在jsonp加载中检查该记录是否存在。如果合适的话,可能在记录上有失效。

例如

http://mysite.com/some_page/ - 用户负载页面,其IP地址添加到允许用户

http://anothersite.com/anotherpage的数据库 - 如上述,添加到数据库

  • 负载JSONP,检查IP存在于数据库中。
  • 一小时后删除记录从数据库,所以另一个页面加载将需要例如

虽然这可能很容易被周围如果刮板(或其他部位)设法制定出什么方法奏效您正在使用允许用户查看JSONP,他们只需首先点击页面。

-1

我敢肯定,你可以用htaccess的做到这一点 -

确保您的头被发送“HTTP_REFERER” - 我不知道,如果你告诉它是不会发送任何浏览器。(如果你仍然担心,优雅地退后)

然后使用htaccess来允许/拒绝来自右侧引用者的访问。

# deny all except those indicated here 
order deny,allow 
deny from all 
allow from .*domain\.com.* 
0

如何使用包含每个jsonp请求使用的令牌的cookie? 根据设置,如果您不想使用cookie,也可以使用变量。

0

使用import表单Web Worker的importScript与jsonp非常相似。 像AlexPoon说的做一个复选。主要脚本为网络工作者,网络工作者切断并返回安全查询。如果网络工作者回答主要脚本而不被询问或错误的标记,那么最好将您的网站转发到涅v。如果服务器被问到错误的标记,请不要回答。 Cookie不会与importScript请求一起发送,因为文档在web worker级别不可用。始终发送与安全相关的Cookie与发布请求。

但仍有很多风险。中间的人知道如何。