Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止直接访问我的JSON服务?_Javascript_Web Services_Security_Json - Fatal编程技术网

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

Javascript 如何防止直接访问我的JSON服务?,javascript,web-services,security,json,Javascript,Web Services,Security,Json,我有一个JSON web服务来返回要显示在谷歌地图上的主页标记 本质上,http://example.com调用web服务以查找所有地图标记的位置,如下所示: http://example.com/json/?zipcode=12345 并返回一个JSON字符串,如: {"address": "321 Main St, Mountain View, CA, USA", ...} 因此,在我的index.html页面上,我获取JSON字符串并放置地图标记 然而,我不希望人们直接呼叫我的JSON

我有一个JSON web服务来返回要显示在谷歌地图上的主页标记

本质上,
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/
web服务。。。而不是一些随机的家伙直接调用
/json/

问题:如何防止直接呼叫/访问我的
http://example.com/json/
web服务


更新:

为了更加清晰,请参见
http://example.com/index.html
call
http://example.com/json/?zipcode=12345
。。。以及JSON服务
-返回半敏感数据,
-返回一个JSON数组,
-响应GET请求,
-发出请求的浏览器已启用JavaScript


同样,我不想让人们看到我的
index.html
源代码,然后直接调用JSON服务。

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

或者这里有一个链接,指向Deny指令上的apache文档

编辑(响应新信息)

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

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

我的建议是为服务生成一个在短时间内过期的唯一url。使用Memcache,您可以非常轻松地完成类似的操作。这种策略也可以用于混淆服务url(这不会提供任何实际的安全性,但会提高想要直接呼叫的人的门槛)


最后,您也可以使用公钥加密来实现这一点,但这将非常繁重。您需要为每个请求生成一个新的pub/priv密钥对,并将pubkey返回给js客户端(这里是指向javascript实现的链接)

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

您可能需要某种基于cookie的身份验证。此外,Ignacio在使用POST方面有一个很好的观点。这有助于防止在域上运行不受信任的脚本。然而,我认为使用POST并不是绝对必要的,除非最外层的JSON类型是数组。在您的示例中,它是一个对象。

有几种很好的方法来验证客户端

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


一开始我没有意识到客户端代码正在调用您的web服务。如果让客户端Javascript直接调用您的web服务,那么实际上是不可能阻止人们直接调用您的web服务的。有人可以阅读源代码。

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


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

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

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请求并使用会话上下文检查标志号。如果匹配,则返回响应数据。否则,返回错误消息


4) 在响应结束或超时触发时清除会话上下文。

当人们在网页上下文中说“JSON”时,他们通常指的是XHR,如果不加区别地使用,XHR将阻止拒绝。我相信如果我使用此方法,将拒绝所有人访问我的网站。。。这意味着,如果您指定拒绝所有人访问您的网站,那么这将不起作用。您可以根据位置添加拒绝/允许。。。。约书亚,黑客究竟从哪里来?从他最初的问题(在编辑之前)来看,我觉得他想限制对该服务的访问,只有服务器才能调用该服务。他添加了澄清的编辑,现在解释显然是不正确的?我认为您只能执行GET请求。XmlHttpRequest可以执行任何方法,包括您编写的方法。打开请求时的第一个参数是方法,它是一个任意字符串。“允许/否认”不起作用吗?因为那会否定每个人