我有一个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);
哦,对了,答案是:没有办法让它无法访问。