【发布时间】:2017-02-25 04:24:58
【问题描述】:
我正在考虑我的 python web 应用程序的安全实施。 例如,我有用户和个人资料。 每个用户都可以通过在 /profile/user_id 发送 POST 来编辑他的个人资料
在每个请求上,我都可以获取会话 user_id 并将其与 profile.user_id 进行比较,如果它们不同 - 引发 SecurityException()。
但我也可以使用另一种更常见的方式: 为每个配置文件生成
secret = hash(profile_data+secret_key)
并为身份验证渲染。用户链接如下:
/profile/4?key=secret
所以想法是根据可编辑的对象数据生成密钥并在服务器端检查此密钥。如果用户不知道密钥,则无法获取编辑其他配置文件的链接,因此无法修改它们。
这种保护方法怎么叫? 与基于会话的 user_id 检查相比有什么问题吗?
【问题讨论】:
-
取决于是否允许用户修改其他用户的配置文件,秘密方法可能起作用,请记住,您应该了解一些安全攻击以及如何防范它们,例如定时攻击.另一个问题是用户体验,如果用户编辑他的个人资料,从而修改了他的密钥,那么之前的所有 URL 都会失效,这很麻烦。另外,我不知道这是否只是因为它是一个示例,但要注意内置的
hash函数,它在密码学上并不安全。 -
链接无效的问题可以通过只在像 ID 这样的持久数据上生成哈希来解决......所以哈希(id+secret),是不是比在可变数据上生成更不安全?
-
我只是看不到专业人士,您会得到更丑陋的 URL,如果机密泄露,您必须更新所有用户的 URL。
-
...如果用户点击外部链接,秘密将与推荐人一起泄露。
标签: python security web-applications