我有一个JSON Web服务来返回要在我的GoogleMap上显示的主页标记。
实际上,http://example.com
调用Web服务来找出要显示的所有Map标记的位置,如下所示:
http://example.com/json/?zipcode=12345
它返回一个JSON字符串,例如:
{"address": "321 Main St, Mountain View, CA, USA", ...}
因此,在我的index.html
页面上,我使用JSON字符串并放置Map标记。
然而,我不希望发生的是人们直接调用我的JSON Web服务。
我只希望http://example.com/index.html
能够调用我的http://example.com/json/
Web服务...而不是某个随机的家伙直接调用/json/
。
问题:如何防止直接调用/访问http://example.com/json/
Web服务?
更新日期:
为了更清楚起见,http://example.com/index.html
调用http://example.com/json/?zipcode=12345
...和JSON服务
- 返回半敏感数据,
- 返回JSON数组,
- 响应GET请求,
- 发出请求的浏览器启用了JavaScript
同样,我不希望发生的是,人们只是查看我的index.html
源代码,然后直接调用JSON服务。
7条答案
按热度按时间rmbxnbpk1#
有几种很好的方法可以验证客户端。
编辑:
一开始我没有注意到你的Web服务是由客户端代码调用的。如果你让客户端的Javascript来做的话,完全不可能阻止人们直接调用你的Web服务。有人可能只是读了源代码。
u4dcyp6a2#
这里有一些更具体的答案,但我想提出以下一般性的观点:
通过 AJAX 所做的任何事情都是由用户的浏览器加载的。如果你想的话,你可以让黑客的生活变得艰难,但是,最终,没有办法阻止我获得你已经免费提供给我的数据。任何公开可用的服务都是公开可用的,简单明了。
tyg4sfes3#
如果您使用的是Apache,则可以在位置上设置允许/拒绝。
http://www.apachesecurity.net/
或者这里有一个链接,指向有关Deny指令的apache文档
http://httpd.apache.org/docs/2.0/mod/mod_access.html#deny
编辑(对新信息作出响应)。
Deny指令也可以和环境变量一起工作。你可以根据浏览器字符串来限制访问(不太安全,但是不鼓励随意浏览),这仍然允许XHR调用。
我建议实现这一点的最佳方法是使用某种令牌来验证请求是“好”请求。您可以使用cookie、某种会话存储或参数(或某种组合)来验证请求。
我的建议是为服务生成一个唯一的url,它会在短时间内过期。你可以很容易地用Memcache来做类似的事情。这个策略也可以用来混淆服务url(这不会提供任何实际的安全性,但会提高直接调用的门槛)。
最后,您还可以使用公钥加密来实现这一点,但这将是 * 非常 * 繁重的。您需要为每个请求生成一个新的pub/priv密钥对,并将pubkey返回给js客户机(这里有一个链接指向javascript中的一个实现)http://www.cs.pitt.edu/~kirk/cs1501/notes/rsademo/
thigvfpy4#
您可以添加一个随机数作为标志,以确定请求是否来自刚发送的页面:
1)当生成
index.html
时,向JSON请求URL添加一个随机数:旧版:
http://example.com/json/?zipcode=12345
新增:
http://example.com/json/?zipcode=12345&f=234234234234234234
同时将此编号添加到 * 会话上下文 * 中。
2)客户端浏览器呈现
index.html
并通过新的URL请求JSON数据。3)服务器获取json请求,并使用 Session Context 检查标志号。如果匹配,则返回响应数据。否则,返回错误消息。
4)在响应结束或超时触发时清除 * 会话上下文 *。
brjng4g35#
只接受对产生JSON的URL的POST请求。这不会阻止有决心的人访问它,但会阻止随意浏览。
falq053o6#
我知道这是旧的,但对于任何人来这里以后,这是最简单的方法来做到这一点。你需要保护 AJAX 子页面与密码,你可以设置在容器页面之前调用包含。
最简单的方法是在 AJAX 调用时要求HTTPS并传递一个POST变量。HTTPS + POST确保密码始终是加密的。
因此,在 AJAX /子页面上执行类似以下操作
当你调用 AJAX 时,确保在你的有效载荷中包含POST变量和密码。因为它是在POST中,所以它会被加密,而且因为它是随机的(希望如此),没有人能猜到它。
如果要在另一个页面上直接包含或要求PHP,只需在包含它之前将POST变量设置为密码。
这比维护全局变量、会话变量或cookie要好得多,因为其中一些变量在页面加载过程中是持久的,因此您必须确保在检查后重置状态,这样用户就不会意外访问。
此外,我认为它比页眉更好,因为它不能被嗅探,因为它是由HHTPS保护的。
hvvq6cgz7#
您可能需要使用某种基于Cookie的身份验证。此外,伊格纳西奥关于使用POST有一个很好的观点。如果您的域中运行了不受信任的脚本,这可以帮助防止JSON hijacking。但是,我不认为使用POST是绝对必要的,除非最外层的JSON类型是一个数组。在您的示例中,它是一个对象。