我使用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都是自动注册的,因此第一个注册的用户将获得ID 1,依此类推。
同一家庭中的每个用户(因此具有相同的family_ID(都可以查看其他家庭成员的爱好。我有一个SQL查询,它给了我所有的家庭成员。在我的网站上,我有一个简单的下拉菜单,可以在那里选择会员。通过GET请求,我想要检索所选成员的所有爱好
现在我基本上可以决定是使用id还是使用电子邮件作为请求参数,例如/api/hobbies/:id
还是/api/hobbies/:email
。电子邮件显示了更多的私人信息,而id显示了关于我的内部结构的信息,比如";至少存在(id(个用户&";。我认为最好使用id。
也许还有可能在数据库中分配一个随机id(而不是自动递增(?但是我不知道该怎么做。
作为参数发送给GET请求的任何内容都不是私有的。这些参数是您获取的URL的一部分,这些URL可以在未经您或用户同意的情况下登录到互联网上的各种代理服务器等中。
在我看来,家庭成员的爱好可能是敏感数据。如果全家都喜欢打高尔夫球呢?一个网络罪犯很容易就知道周六下午是入室盗窃的好时机。
如果你的应用程序使用自动递增的id值执行GET操作,那么网络犯罪分子检查他们想要的任何记录就是儿戏。例如,看看Panera Bread的数据泄露。https://krebsonsecurity.com/2018/04/panerabread-com-leaks-millions-of-customer-records/
对于这种数据,至少要使用POST。
更好的是,在你的应用程序上使用一个良好的身份验证/会话令牌系统,如果用户不是该家庭的成员,则向他们隐藏数据。
而且,如果你想使用REST风格的GET参数,你需要做以下事情来确保安全:
- 使用随机化的id值。对于一个网络罪犯来说,从知道第一个值中猜测第二个值肯定是非常困难的。序列号不行,电子邮件地址也不行
- 确保未经身份验证的用户看不到任何数据
- 确保经过身份验证的用户只能看到他们获得授权的数据子集
我建议避免REST风格的GET参数,来自多个安全审计人员,他们说,你必须改变这一点。