如何防止 HTTP POST 请求仅被批准的 javascript 客户端接收?

How can I protect an HTTP POST request from only being received by an approved javascript client?

我有一个 URL 可以接受 POSTed 数据并存储它的记录——这是为了分析。我需要防止世界上任何人从 POST 访问它,但是我可以使用什么可能的身份验证机制来安全地公开其详细信息?我不认为 javascript 可以访问任何秘密数据而不使它成为 public.

我可以基于任何 HTTP header,但这些都可以被欺骗,对吧?

如果有帮助,客户端和服务器都是https。

编辑:我想我需要更明确地说明问题;抱歉,我以为我可以简明扼要地解释一下,但显然没有遇到!想象一下:

  1. https://example.com/index.html 的静态页面包含一个脚本,https://example.com/script.js

  2. 脚本向另一个远程服务器发出请求URL,例如

    ajax_call('https://stats.example.com/stats.php', 'some data');
    
  3. stats.php 脚本只是将 'some data' 写入文件

现在,缺陷是任何人都可以简单地 POST 任何东西到 stats.php 并且它会写入文件。我想将其限制为我的 'client',即 https://example.com/index.html.

如果可以的话,我会在stats.php中做这样的事情:

if ($_SERVER["HTTP_REFERER"] == 'https://example.com') {
    do_stuff();
} else {
    die('not allowed');
}

但我一直认为 HTTP_REFERER(和其他类似的 headers)可能只是被欺骗,所以那将毫无意义。

您可以使用 CORS 并使您的后端仅接收来自特定主机的请求/DOMAIN

I need to secure that against anyone in the world from POSTing to it, but what possible authentication mechanism can I use that it is safe to expose the details of?

如果访问 public 网站的每个人的浏览器都需要访问端点,那么您不能。

浏览器完全在用户的控制之下。他们可以检查浏览器所做的一切。然后他们可以使用其他一些 HTTP 客户端重新创建它。

如果您足够信任浏览器,让它向您的分析发出请求API,那么您也必须信任浏览器的所有者。分开是不可能的。


您能做的最好的事情就是分析发送到分析器的数据 API 以了解常见或不可能的行为模式。