【问题标题】:Securing JSONP?保护 JSONP?
【发布时间】:2011-04-21 21:22:41
【问题描述】:
我有一个使用 JSONP 进行跨域 ajax 调用的脚本。这很好用,但我的问题是,有没有办法阻止其他网站访问这些 URL 并从这些 URL 获取数据?我基本上想列出一个允许的站点列表,并且只有在它们在列表中时才返回数据。我正在使用 PHP,并且认为我可能能够使用“HTTP_REFERER”,但已经读到某些浏览器不会发送此信息.... ???有什么想法吗?
谢谢!
【问题讨论】:
标签:
php
jquery
cross-domain
jsonp
【解决方案1】:
确实没有有效的解决方案。如果您的 JSON 可以通过浏览器访问,那么其他站点同样可以访问它。对于 Web 服务器来说,来自浏览器或其他服务器的请求除了标头之外几乎无法区分。就像 ILMV 评论的那样,引用者(和其他标题)可以被伪造。毕竟,他们是自我报告的。
安全性从来都不是完美的。一个足够坚定的人可以克服任何现有的安全措施,但安全的目标是建立足够高的威慑力,阻止外行和/或大多数人投入必要的时间和资源来破坏安全。
考虑到这一点,您可以创建一个足够高的进入壁垒,以使其他网站在设置进入壁垒的情况下可能不会费心提出请求。您可以生成获取 json 数据所需的一次性令牌。一旦使用令牌来获取 json 数据,该令牌随后就会失效。为了检索令牌,必须使用嵌入在 javascript 中的页面中的令牌来请求网页,然后将其放入 ajax 调用中以获取 json 数据。将此与过期令牌和 javascript 中的充分混淆相结合,您就创造了一个足够高的障碍。
请记住,这并非不可能规避。另一个网站可以从 javascript 中提取令牌,或者拦截 ajax 调用并在多个点劫持数据。
【解决方案2】:
您是否有权访问您希望授予 JSONP 访问权限的服务器/站点?
您可以做的,虽然不理想是在允许查看 JSONP 的页面加载时向 IP 的数据库添加一条记录,然后在 jsonp 加载时检查该记录是否存在。如果合适的话,可能会在记录中注明到期日期。
例如
http://mysite.com/some_page/ - 用户加载页面,将其 IP 添加到允许用户的数据库中
http://anothersite.com/anotherpage - 同上,添加到数据库
- 加载JSONP,检查IP是否存在于数据库中。
- 一小时后从数据库中删除记录,因此例如需要再次加载页面
虽然如果抓取工具(或其他网站)设法找出您使用什么方法来允许用户查看 JSONP,这很容易解决,但他们只需要先点击页面。
【解决方案3】:
如何使用一个 cookie 来保存用于每个 jsonp 请求的令牌?
如果您不想使用 cookie,也可以根据设置使用变量。
【解决方案4】:
从 Web Worker 中使用 importScript 与 jsonp 完全一样。
像 AlexPoon 所说的那样进行仔细检查。 Web Worker 的主脚本,Web Worker 与安全查询断开和返回。如果网络工作者在没有被询问或使用错误令牌的情况下回答主脚本,最好将您的网站转发到必杀技。如果用错误的令牌询问服务器,请不要回答。 Cookie 不会随 importScript 请求一起发送,因为文档在 Web Worker 级别不可用。始终通过发布请求发送与安全相关的 cookie。
但是仍然存在很多风险。中间的人知道怎么做。
【解决方案5】:
我确定你可以用 htaccess 做到这一点 -
确保您的标头发送“HTTP_REFERER” - 如果您告诉它,我不知道任何浏览器不会发送它。 (如果你还在担心,请优雅地退后)
然后使用 htaccess 允许/拒绝来自正确引用者的访问。
# deny all except those indicated here
order deny,allow
deny from all
allow from .*domain\.com.*