【问题标题】:Restrict HTTP API from public access限制 HTTP API 的公共访问
【发布时间】:2012-08-13 14:02:10
【问题描述】:

我有一个 Web 应用程序,它由一个 JavaScript 前端和一个用 PHP 构建的后端组成,前端向后端的 URL 发出一些 AJAX 请求,例如:api.examplesite.com?q=some_query,结果以 JSON 格式返回。

任何知道此 URL 的人都可以直接调用它并获得相同的结果。

使第三方无法访问此 URL 但仍适用于我的应用程序的最佳做法是什么?

【问题讨论】:

标签: php json security web-applications


【解决方案1】:

任何可用于 AJAX 调用的 URL 都可用于公共网络。要使其保持“私密性”,您可以将其绑定到用户会话或令牌,您可以在主页上启动并在 AJAX 调用中持续存在。

另外,如果“some_query”是一个实际的 SQL 语句,这对于 AJAX 调用来说被认为是非常糟糕的做法。您的 SQL 应该只在服务器端直接可用,而不是任意客户端。

【讨论】:

  • 将其绑定到会话或令牌不会解决此安全问题,任何可以登录的用户仍然可以删除数据库
  • 他询问如何将 AJAX 调用限制在主站点。会话或令牌将执行此操作。它需要任何 SQL 语句的事实是单独的(主要)问题。
  • 澄清一下:当我说“some_query”时,我绝对不是指 SQL 查询!
  • @SportBilly 可能会更改您的问题,以澄清在您在这里引发任何更多的壁炉攻击之前出价更高
【解决方案2】:

实际上没有办法做到这一点。您的应用程序是客户端,因此它需要从服务器获取响应。就是说无论如何都可以被客户端拦截。

您可以使用加密来防止截获数据的人读取数据。您可以在客户端应用程序中使用对称密码和硬编码某些密钥(这不好,因为如果密钥被泄露,则可以解密来自所有客户端的所有流量),或者您可以使用 SSL/TLS 与服务器(如果您传输敏感信息,我认为这是最好的解决方案)。

【讨论】:

  • 问题是如何防止对他的 AJAX URL 的任意请求,而不是如何在请求期间保护信息。
【解决方案3】:

客户端必须能够请求 URL 才能使用它。但是,您可以检查该请求是否是使用 ajax 发出的,然后相应地返回信息:

if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
    AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest') {
   // I'm AJAX!
}

Check this out for more info

【讨论】:

  • 这种方法可能无法达到安全的目的...首先...攻击者可以用ajax编写自己的应用程序...其次,可以伪造通过将适当的标头注入 http 请求的 ajax 请求...
【解决方案4】:

为了安全起见,您可以在执行查询之前尝试强制使用数字类型或引用字符串。

例如

$number = (int) $number;
$string = htmlspecialchars($string);

哦,对了,答案是:没有办法让它无法访问。

【讨论】:

  • 这不会解决这个安全问题,用户仍然可以运行他们想要的任何查询
  • 当然会修复它,由于限制,他们将无法运行任何他们想要的查询
  • 它也不会使函数“私有”,所以它真的不是问题的答案
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多