首页 > 解决方案 > 我可以毫不犹豫地通过 GET 请求发送哪些数据?

问题描述

我创建了一个带有 express 和 sequelize 的 VueJS 应用程序来访问一个 mysql 数据库(当前使用 XAMPP 运行)。我有一个由 3 个表组成的数据库:

users:    [id (primary key), name, email, family_id (foreign key)]  
families: [id (primary key), name]  
hobbies:  [id (primary key), name, user_id (foreign key)]

所有这些 ID 都是 auto_increment,因此第一个注册的用户将获得 ID 1,依此类推。
同一家庭中的每个用户(因此具有相同的family_id)都可以查看其他家庭成员的爱好。我有一个 SQL 查询,它给了我所有的家庭成员。在我的网站上,我有一个简单的下拉菜单,我可以在其中选择成员。然后,通过 GET 请求,我想检索所选成员的所有爱好。
现在我基本上可以决定是否使用 id 或电子邮件作为请求参数,例如/api/hobbies/:id/api/hobbies/:email. 电子邮件显示更多私人信息,而 id 显示有关我的内部结构的信息,例如“至少存在 (id) 个用户。”。我认为最好使用id。
也许还有可能​​在数据库中分配一个随机 id(不是自动增量)?但我不知道该怎么做。

标签: mysqlsqlsecurityget

解决方案


您作为参数发送给 GET 请求的任何内容都不是私有的。这些参数是您获取的 URL 的一部分,这些 URL 可以在未经您或您的用户同意的情况下登录到整个 Internet 上的各种代理服务器等。

在我看来,家庭成员的爱好可能是敏感数据。如果全家人都喜欢打高尔夫球怎么办?网络窃贼很容易发现周六下午是入室盗窃的好时机。

如果您的应用程序使用自动递增的 id 值执行 GET 操作,那么对于网络蠕虫来说,检查他们想要的任何记录都是小菜一碟。例如,查看 Panera Bread 数据泄露事件。https://krebsonsecurity.com/2018/04/panerabread-com-leaks-millions-of-customer-records/

至少对这种数据使用 POST。

更好的是,在您的应用程序上使用良好的身份验证/会话令牌系统,如果用户不是该家族的成员,则对他们隐藏数据。

而且,如果你想使用 REST 风格的 GET 参数,你需要做这些事情来保证安全:

  1. 使用随机的 id 值。网络爬虫很难通过知道第一个值来猜测第二个值。序列号不行。电子邮件地址也不会。
  2. 确保未经身份验证的用户看不到任何数据。
  3. 确保经过身份验证的用户只能看到他们被授权的数据子集。

我建议避免使用 REST 风格的 GET 参数来自多个安全审计员说,你必须改变它。


推荐阅读