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

IT技术 javascript web-services security json
2021-03-02 05:25:48

我有一个 JSON Web 服务来返回要显示在我的 Google 地图上的主页标记。

本质上,http://example.com调用 Web 服务来找出所有要显示的地图标记的位置,如下所示:

http://example.com/json/?zipcode=12345

它返回一个 JSON 字符串,例如:

{"address": "321 Main St, Mountain View, CA, USA", ...}

所以在我的index.html页面上,我使用该 JSON 字符串并放置地图标记。

但是,我不希望发生的是人们直接调用我的 JSON Web 服务

我只想http://example.com/index.html能够调用我的http://example.com/json/网络服务......而不是一些随机的家伙/json/直接调用

问题:如何防止直接调用/访问我的http://example.com/json/Web 服务?


更新:

为了更清楚,http://example.com/index.html调用http://example.com/json/?zipcode=12345... 和 JSON 服务
- 返回半敏感数据,
- 返回一个 JSON 数组,
- 响应 GET 请求,
- 发出请求的浏览器启用了 JavaScript

同样,我不希望发生的是人们只是查看我的index.html源代码,然后直接调用 JSON 服务。

6个回答

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

  • 通过 IP 地址。在 Apache 中,使用 Allow / Deny 指令。
  • 通过 HTTP 身份验证:基本或摘要。这很好且标准化,并使用用户名/密码进行身份验证。
  • 通过饼干。你必须拿出饼干。
  • 通过您发明的自定义 HTTP 标头。

编辑:

一开始我没有发现客户端代码正在调用您的 Web 服务。如果您让客户端 Javascript 执行此操作,实际上不可能阻止人们直接调用您的 Web 服务。有人可以阅读源代码。

Allow / Deny 会不会不起作用,因为这会拒绝所有人访问调用 JSON 请求的 index.html。
2021-04-25 05:25:48
迪特里希,确切地说 - 阅读我的源代码的人是关注点。那么就没有办法预防了吗?
2021-04-25 05:25:48
正确,没有办法阻止。这就像给某人一套钥匙,然后告诉他们只在星期四开门。
2021-05-14 05:25:48
同意,没有办法阻止。其他线程也讨论了这个问题 - stackoverflow.com/questions/2561999/...stackoverflow.com/questions/2576509/...
2021-05-16 05:25:48

这里有一些更具体的答案,但我想提出以下一般观点:

通过 AJAX 完成的任何事情都由用户的浏览器加载。如果你愿意,你可以让黑客的生活变得艰难,但最终,没有办法阻止我获取你已经免费提供给我的数据任何公开可用的服务都是公开可用的,简单明了。

如果您使用的是 Apache,您可以在位置上设置允许/拒绝。

http://www.apachesecurity.net/

或者这里是关于拒绝指令的 apache 文档的链接

http://httpd.apache.org/docs/2.0/mod/mod_access.html#deny

编辑(响应新信息)。

Deny 指令也适用于环境变量。您可以基于浏览器字符串(不是真正安全,但不鼓励随意浏览)限制访问,这仍然允许 XHR 调用。

我建议实现此目的的最佳方法是使用某种令牌来验证请求是否为“良好”请求。您可以使用 cookie、某种类型的会话存储或参数(或某种组合)来做到这一点。

对于这样的事情,我建议为在短时间内过期的服务生成一个唯一的 url。您可以使用 Memcache 轻松完成类似的操作。此策略还可用于混淆服务 url(这不会提供任何实际的安全性,但会提高想要直接拨打电话的人的门槛)。

最后,您也可以使用公钥加密来执行此操作,但这会非常繁重。您需要为每个请求生成一个新的公钥/私钥对,并将公钥返回给 js 客户端(这里有一个 javascript 实现的链接)http://www.cs.pitt.edu/~kirk/cs1501 /笔记/rsademo/

当人们在网页上下文中说“JSON”时,他们通常指的是 XHR,如果不加区别地使用,Deny 会阻止它。
2021-05-01 05:25:48
我相信如果我使用这种方法,那将拒绝每个人访问我的网站。... 意思是,这行不通
2021-05-10 05:25:48
如果您指定拒绝所有人,它只会拒绝所有人访问您的网站。您可以根据位置添加拒绝/允许。
2021-05-12 05:25:48
...... 黑客究竟来自哪里,约书亚?
2021-05-13 05:25:48
从他最初的问题(在编辑之前)看,在我看来,他希望以只有服务器可以调用该服务的方式限制对该服务的访问。他添加了澄清的编辑,现在这种解释显然是不正确的。
2021-05-16 05:25:48

您可以添加一个随机数作为标志来确定请求是否来自刚刚发送的页面:

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

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

XmlHttpRequest 可以做任何方法,包括你自己编的方法。打开请求时的第一个参数是方法,它是一个任意字符串。
2021-04-24 05:25:48
我使用类似 jQuery 的东西,它知道如何发布 XHR。api.jquery.com/jQuery.post
2021-05-01 05:25:48
我如何做 POST XmlHttpRequest?我以为你只能做 GET 请求。
2021-05-20 05:25:48