首页 > 解决方案 > 如何将唯一的用户 ID 传递到包含用户特定的个人数据的页面

问题描述

我正在通过 Emma(第 3 方供应商)发送一封群发电子邮件,其中包含指向登录页面的链接。登陆页面将被个性化并显示一些用户的识别信息(姓名、头衔、电子邮件)。此外,还会有一个表格收集用户的一些偏好,这些偏好将被保存回 Emma 数据库中该用户的记录中。

第 3 方数据库中的用户 ID 列是增量的,因此我显然不能只通过查询字符串附加该值,否则例如用户 522 将获得一个链接,例如www.example.com?landing/?uid=522允许他(或任何拥有该链接的人)c 获取随意猜测其他值uid(例如 523... 或 444)并更改其他用户的偏好以及很容易地查看他们的个人数据。

最重要的是,我正在尝试找到一种安全的方式来传递一个 ID(或其他唯一值),我可以通过 API 查找并使用它来动态显示,然后在用户的此登录页面上重新提交个人信息/数据-以用户为基础。

我想在 Emma 的列表中添加一个自定义列作为唯一标识符。然后我会编写一个脚本(访问 Emma 的 API)对 ID(或者可能是电子邮件地址,因为这也是唯一的)进行 BASE64 编码,并将其添加到每个用户的列表中。然后,在我的电子邮件中,我可以将它以 的形式传递到登录页面?xy=ZGF2ZUBidWRvbmsuY29t,但我知道这是编码而不是加密,所以不是那么安全……或者根本不安全。

据我所知,接收邮件的任何人都没有能力和/或倾向于知道链接中的那些额外字符是什么,BASE64 解码,BASE64 编码另一个电子邮件地址或整数,并使用新的 BASE64 编码发出请求价值,以便以一种意想不到的方式操纵我的系统。

但是出于这个问题的目的,我想知道执行此操作的“正确”方法,或者在类似情况下目前采取的安全级别。我已经阅读了有关 JWT 令牌和一些 OOth 的内容,但我不太确定这是可能的,因为我也有 Emma API 来处理......和/或这是否是矫枉过正。

当用户能够提交“妥协”(有意或无意)表单时,将值传递给页面的适当/标准又用于重新提交表单以及其他用户提供的值最糟糕的是,可能会导致他们的竞争对手有不良偏好并选择在我们的 Emma 邮件列表中保存数据?

标签: securityencryptionencodingmass-emails

解决方案


网络安全就是关于“可接受的风险”。您可以通过多种方式降低风险,但最终总会有一些您必须愿意接受的风险敞口。

您最好的选择是强制用户登录以查看页面,并避免使用任何查询字符串参数。这样,页面的后端就可以将 ID(或它可能需要的任何东西)从服务器的会话中提取出来。

您的下一个最佳选择仍然涉及强制用户登录,但uid在 URL 中保留 - 只需确保验证用户有权访问uid(即不要让用户访问其他用户的信息)。

如果您不能这样做……那么您可以创建存储在数据库中的随机键/ID,并在 URL 中使用这些值(而不是uid真实email数据)。但是让我们明确一点:这并不安全,因为在技术上可以猜测/推断该方案。

绝对不要尝试将 URL 中的信息作为 base64 编码数据传递,这很可能是黑客首先想到的。

请记住,任何will be abused通过自动化工具返回任何类型 PII 的不安全 API ......不仅仅是一个用户在你的表单上放屁。

据我所知,接收邮件的任何人都没有能力和/或倾向于知道的风险

^ 这总是一个糟糕的假设。即使结果是at worst您认为微不足道的事情,它也会为升级攻击打开大门,并使公司面临它可能不想接受的风险。

如果您在错误的选择之间陷入困境,我的专业建议是召开会议,记录会议纪要(视频或文档),并让具有“权威”的人批准您采取的方法。


推荐阅读