【发布时间】:2021-05-10 15:26:07
【问题描述】:
我有一个使用 PHP 的 API 和 Python 中的客户端应用程序的 Web 服务器。客户端应用程序向服务器发送请求,其中包含客户端使用的操作系统或他的计算机上正在运行的服务等信息。 HTTP POST 请求可能如下所示:
发布http://www.example.com/users/info
和 POST 数据如:
{
"os": "Windows 10",
"services": [
"chrome.exe",
"firefox.exe",
"calc.exe"
]
}
我希望只有我的应用程序能够发送该请求。如何保护这些数据免受用户自我操纵?
我使用 HTTPS 请求来保护数据,但我确定这还不够。
【问题讨论】:
-
您希望将端点保护到什么级别?您是要防范流氓用户还是完整的系统管理员?还是您只是不希望互联网上的随机机器人攻击您的端点? “够了”真的取决于你的威胁模型
-
该应用程序将可供所有人使用,因此我想保护它免受您编写的所有案例的影响。
-
首先,您无法阻止未经授权的人发送,因此您需要将视角转变为仅接受授权的有效负载,并阻止或丢弃其余的。密钥是一种常见的方式,通过唯一的每个客户端密钥在客户端对数据进行签名。密钥通常对普通用户隐藏,但系统管理员仍然可以看到它们,所以你有问题。但是,如果高级用户发送无效数据,你真的在乎吗?难道仅仅是可以忽略的噪音吗?
-
我可以防止高级用户吗?我不希望他们使我的数据库超载或发送虚假数据
-
这真的取决于发送虚假/过多数据的“价值”。它是否以某种方式为他们赢得了一些东西,或者是否有某种外部验证,然后他们可以向其他人证明他们已经完成了任务?如果是这样,它就会成为高级用户可能想要玩的游戏。如果你有唯一的签名密钥,你可以根据需要撤销,你也可以在防火墙级别通过 IP 阻止。如果您可以拥有具有过期/刷新功能的短期密钥(如 JWT),您可以让用户更烦人,并减少问题的时间窗口。