我如何限制JSON访问?

我有一个Web应用程序从我新创建的JSON API中提取数据。

我的静态HTML页面通过JavaScript从静态HTML页面动态调用JSON API。

我如何限制对我的JSON API的访问,以便只有我(我的网站)可以从它调用?

如果有帮助,我的API类似于:http://example.com/json/?var1 = x&var2 = y&var3 = z ...它根据查询生成适当的JSON。

我使用PHP来生成我的JSON结果...可以限制对JSON API的访问,就像检查$_SERVER['HTTP_REFERER']一样简单,以确保API只从我的域调用,而不是远程用户?


限制访问您的域的常用方法是在无限运行的内容之前添加内容。

例如:

while(1);{"json": "here"} // google uses this method
for (;;);{"json": "here"} // facebook uses this method

因此,当您通过XMLHttpRequest或任何其他限于您的域名的方法获取此内容时,您知道需要解析无限循环。 但是如果通过脚本节点获取它:

<script src="http://some.server/secret_api?..."></script>

它会失败,因为脚本将永远不会超出第一条语句。


我想你可能会误解JSON请求从用户的浏览器发起而不是从你自己的服务器发起的部分。 静态的HTML页面被传递给用户的浏览器,然后它转向并执行页面上的Javascript代码。 此代码打开一个新的连接返回到您的服务器以获取JSON数据。 从PHP脚本的角度来看,JSON请求来自外部世界的某个地方。

鉴于上述机制,您可以做的不多,以防止任何人在HTML页面的上下文之外调用JSON API。


在我看来,你不能限制访问权限,只会让它更难。 这有点像访问限制默默无闻。 引用者可以很容易伪造,即使使用短期密钥,脚本也可以通过不断刷新密钥来获得响应。

所以,我们能做些什么?

识别这里的弱点:

http://www.example.com/json/getUserInfo.php?id=443

攻击者现在可以轻松地请求从1到1.000.000的所有用户信息。 auto_increment ID的弱点在于它们的线性,并且很容易猜到。

解决方案:为数据使用非数字唯一标识符。

http://www.example.com/json/getUserInfo.php?userid=XijjP4ow

你不能循环这些。 诚然,您仍然可以解析各种密钥的HTML页面,但这种类型的攻击是不同的(也是更容易避免的)问题。

缺点:当然你不能使用这种方法来限制不依赖于密钥的查询,例如搜索。

链接地址: http://www.djcxy.com/p/47787.html

上一篇: How do I restrict JSON access?

下一篇: How can I modify the Object constructor