我有一个 Web 应用程序,它由一个 JavaScript 前端和一个用 PHP 构建的后端组成,其中前端向后端的 URL 发出一些 AJAX 请求,例如:api.examplesite.com?q=some_query
结果以 JSON 格式返回。
任何知道此 URL 的人都可以直接调用它并获得相同的结果。
使第三方无法访问此 URL 但仍适用于我的应用程序的最佳做法是什么?
我有一个 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);
哦,对了,答案是:没有办法让它无法访问。