代码之家  ›  专栏  ›  技术社区  ›  James

如何限制JSON访问?

  •  30
  • James  · 技术社区  · 16 年前

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

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

    如果有帮助的话,我的API是这样的: http://example.com/json/?var1=x&var2=y&var3=z ... 它基于查询生成适当的JSON。

    $_SERVER['HTTP_REFERER'] 以确保只从我的域而不是远程用户调用API?

    8 回复  |  直到 8 年前
        1
  •  18
  •   Greg Hewgill    16 年前

    我认为您可能误解了启动JSON请求的部分 从用户浏览器

    考虑到上述机制,您无法阻止任何人在HTML页面上下文之外调用JSON API。

        2
  •  18
  •   fearphage    11 年前

    例如:

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

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

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

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

        3
  •  5
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    那么,什么 是吗?

    在这里找出弱点:

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

    攻击者现在可以轻松地在一个循环中请求从1到1.000.000的所有用户信息。 的弱点 auto_increment IDs是它们的线性关系,很容易猜测 .

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

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

    下降趋势: 当然,您不能使用此方法来限制与键无关的查询,例如搜索。

        4
  •  4
  •   matt b    16 年前

    如果使用API的静态页面需要在公共Internet上,那么这里的任何解决方案都将是不完美的。既然你需要让客户的浏览器发送请求并让它得到满足,那么任何人都有可能看到你是如何形成这个URL的。

    如果不要求页面是静态的,那么可以尝试使用由API生成并包含在第一个页面的HTML响应中的短暂“键”,该响应作为参数传递回API。这会增加API的开销,因为必须让服务器在这一端维护一个有效的“密钥”列表、它们的有效期等。

    所以,你可以采取一些步骤,这些步骤不会花费很多钱,但如果有人真的愿意,你不难绕过,或者你可以花更多的时间让它变得更难一点,但是如果你的API必须是公共访问的,没有完美的方法来做到这一点。

        5
  •  4
  •   Laurence Gonsalves    16 年前

    简短的回答是:任何可以访问你网站页面的人也可以访问你的API。

    你可以尝试通过各种方式对你的API进行加密,使其使用变得更加困难,但是由于你必须包含JavaScript代码来解密API的输出,你只需要让自己准备好与任何决定通过其他方式使用你的API的人进行军备竞赛。即使您使用的是短生命周期的密钥,一个确定的“攻击者”也可能在使用API之前只是擦掉HTML(以及当前的密钥)。

    如果你想做的是阻止其他网站在你的网页上使用你的API,那么你可以使用RealRead的标题,但是要记住,不是所有的浏览器都会发送推荐者(而且一些代理也会把它们删除)。。这意味着您希望允许所有请求丢失一个引用,这只会给您提供部分保护。而且,推荐者很容易被伪造,所以如果其他网站 真正地 想要使用您的API,他们总是可以欺骗浏览器并从服务器访问您的API。

        6
  •  0
  •   RQDQ    15 年前

    基本思想是,当用户通过web应用进行身份验证时,一个具有加密值的cookie将返回到客户端浏览器。然后json api将使用该cookie来验证调用方的身份。

    这种方法显然需要使用cookies,所以这对您来说可能是问题,也可能不是问题。

        7
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    你可以(?)通过http访问API ://example.com/json/?var1=x&var2=y,因此只有经过身份验证的使用者才能获取您的数据。。。

        8
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    8 年前

    不能将HTML视为受信任的客户端。这是一个纯文本脚本,在其他人的电脑上按他们认为合适的方式解释。无论你允许自己的JavaScript代码,你都允许任何人。你甚至无法定义“你的”和 Greasemonkey Firebug 在野外。

    您必须复制服务器中的所有访问控制和业务逻辑限制,就像JavaScript客户端中不存在这些限制一样。

    推荐文章