我有一个使用JSONP进行跨域ajax调用的脚本。这很好但我的问题是,有没有办法阻止其他网站访问这些网址并从中获取数据?我基本上想要列出允许的站点列表,如果它们在列表中,则只返回数据。我正在使用PHP和图我可能能够使用“HTTP_REFERER”,但已经读过一些浏览器不会发送此信息.... ???有什么想法吗?
谢谢!
答案 0 :(得分:6)
确实没有有效的解决方案。如果您的JSON可以通过浏览器访问,那么其他站点也可以同样访问它。除了标题之外,对于Web服务器来说,源自浏览器或其他服务器的请求实际上是无法区分的。与ILMV评论一样,引用者(和其他标题)可能被伪造。他们毕竟是自我报道的。
安全永远不会完美。一个有足够决心的人可以克服现有的任何安全措施,但安全的目标是创造足够高的威慑力,使大多数人和/或大多数人不会浪费时间和资源来破坏安全。
考虑到这一点,您可以创建一个足够高的入口门槛,以便其他站点可能不会因为进入障碍而提出请求。您可以生成获取json数据所需的单一用途令牌。一旦使用令牌来获取json数据,则该令牌随后被无效。为了检索令牌,必须使用javascript中嵌入在页面中的令牌来请求网页,然后将其放入json数据的ajax调用中。将其与时间过期的令牌相结合,并在javascript中进行充分的混淆,并且您已经创建了足够高的障碍。
请记住,这不是不可能绕过的。另一个网站可以从javascript中提取令牌,或拦截ajax调用并在多个点劫持数据。
答案 1 :(得分:0)
您是否可以访问要授予JSONP访问权限的服务器/站点?
您可以做什么,虽然不理想但是在允许查看JSONP的页面加载上向IP的数据库添加记录,然后在jsonp加载上检查该记录是否存在。如果合适,也许在记录上有效期。
e.g。
http://mysite.com/some_page/ - 用户加载页面,将其IP添加到允许用户的数据库
http://anothersite.com/anotherpage - 如上所述,添加到数据库
虽然如果刮刀(或其他网站)设法找出您正在使用的方法来允许用户查看JSONP,这可以很容易地解决,但他们只需要先点击页面。
答案 2 :(得分:0)
如何使用包含每个jsonp请求使用的令牌的cookie? 根据设置,如果您不想使用cookie,也可以使用变量。
答案 3 :(得分:0)
使用importScript表单,Web Worker与jsonp完全相同。 像AlexPoon说的做一个双重检查。 Web工作者的主脚本,Web工作者切断和返回安全查询。如果Web工作者回答主脚本而没有被问到或者使用了错误的令牌,那么最好将您的网站转发到必杀技。如果服务器被问错了令牌,请不要回答。 Cookie不会与importScript请求一起发送,因为文档在Web工作者级别不可用。始终使用发布请求发送安全相关的Cookie。
但仍存在很多风险。中间的人知道如何。
答案 4 :(得分:-1)
我确信你可以用htaccess做到这一点 -
确保您的标题发送“HTTP_REFERER” - 我不知道任何浏览器如果您告诉它不会发送它。 (如果你仍然担心,请优雅地退后)
然后使用htaccess允许/拒绝来自右侧引用的访问。
# deny all except those indicated here
order deny,allow
deny from all
allow from .*domain\.com.*