Web Services 如何防止直接访问我的JSON服务?

smdncfj3  于 2022-11-30  发布在  其他
关注(0)|答案(7)|浏览(247)

我有一个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服务。
rmbxnbpk

rmbxnbpk1#

有几种很好的方法可以验证客户端。

  • 在Apache中,使用Allow / Deny指令。
  • 通过HTTP身份验证:基本的或摘要的。这是很好的和标准化的,并使用用户名/密码来进行身份验证。
  • 你得自己想办法。
  • 通过您发明的自定义HTTP头。

编辑:
一开始我没有注意到你的Web服务是由客户端代码调用的。如果你让客户端的Javascript来做的话,完全不可能阻止人们直接调用你的Web服务。有人可能只是读了源代码。

u4dcyp6a

u4dcyp6a2#

这里有一些更具体的答案,但我想提出以下一般性的观点:
通过 AJAX 所做的任何事情都是由用户的浏览器加载的。如果你想的话,你可以让黑客的生活变得艰难,但是,最终,没有办法阻止我获得你已经免费提供给我的数据。任何公开可用的服务都是公开可用的,简单明了。

tyg4sfes

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/

thigvfpy

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)在响应结束或超时触发时清除 * 会话上下文 *。

brjng4g3

brjng4g35#

只接受对产生JSON的URL的POST请求。这不会阻止有决心的人访问它,但会阻止随意浏览。

falq053o

falq053o6#

我知道这是旧的,但对于任何人来这里以后,这是最简单的方法来做到这一点。你需要保护 AJAX 子页面与密码,你可以设置在容器页面之前调用包含。
最简单的方法是在 AJAX 调用时要求HTTPS并传递一个POST变量。HTTPS + POST确保密码始终是加密的。
因此,在 AJAX /子页面上执行类似以下操作

if ($_POST["access"] == "makeupapassword")
{
  ...
}
else
{
  echo "You can't access this directly";
}

当你调用 AJAX 时,确保在你的有效载荷中包含POST变量和密码。因为它是在POST中,所以它会被加密,而且因为它是随机的(希望如此),没有人能猜到它。
如果要在另一个页面上直接包含或要求PHP,只需在包含它之前将POST变量设置为密码。

$_POST["access"] = "makeupapassword";
require("path/to/the/ajax/file.php");

这比维护全局变量、会话变量或cookie要好得多,因为其中一些变量在页面加载过程中是持久的,因此您必须确保在检查后重置状态,这样用户就不会意外访问。
此外,我认为它比页眉更好,因为它不能被嗅探,因为它是由HHTPS保护的。

hvvq6cgz

hvvq6cgz7#

您可能需要使用某种基于Cookie的身份验证。此外,伊格纳西奥关于使用POST有一个很好的观点。如果您的域中运行了不受信任的脚本,这可以帮助防止JSON hijacking。但是,我不认为使用POST是绝对必要的,除非最外层的JSON类型是一个数组。在您的示例中,它是一个对象。

相关问题