限制公共访问 HTTP API


Restrict HTTP API from public access

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

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

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

可用于

AJAX 调用的任何 URL 都可用于公共 Web。 要使其保持"私有",您可以将其绑定到用户会话或令牌,您将在主页上启动该会话或令牌,并在 AJAX 调用中保留。

此外,如果"some_query"是实际的 SQL 语句,则对于 AJAX 调用来说,这被认为是极其糟糕的做法。 您的 SQL 应该只在服务器端直接可用,而不是任何任意客户端。

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

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

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

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

查看此内容以获取更多信息

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

例如

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

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