我如何限制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