如果有人登录,我会保存 2 个会话。
Session["userid"]
Session["nickname"]
Session["userid"]
用于从数据库中检索有关用户的数据。
用于将Session["nickname"]
用户重定向到他的个人资料页面
(例如:(www.test.com/mike
在这种情况下,''Mike'' 是昵称)。
我想知道这个想法是否安全?是否建议这样做,还是有其他更好的选择?
您不是在存储两个会话,而是在会话中存储两个变量。有两个变量从根本上没有错,我唯一的想法是如果nickname
更新会发生什么?每次使用userid
作为键而不是使用在登录后固定的静态变量而不是更好地从数据库中查找昵称不是更好吗?
话虽如此,为此使用 Forms Authentication Ticket 比使用 Session 更安全。出于一些充分的理由,请参见此处:https ://stackoverflow.com/a/18077422/413180
我看不出有什么大问题,除非以后可以更改某个用户的昵称。在这种情况下,用户个人资料的 URL 将发生变化,您应该正确调整所有链接。
对于 URL,我会使用 UID。并将其存储在 SESSION 变量中。例如,如果用户更改 SESSION 变量之一的值会发生什么?你会在每次页面加载时验证它吗?
数据是安全的还是不安全的,数据是否存储在两个单独的Session
对象中并不重要。所以如果用户ID或昵称可以被某人恶意使用,那么它是不安全的;否则不是。
我通常将用户信息存储在一个Session
名为 like 的对象中LoggedOnUser
,它代表一个类的实例。在您的情况下,创建一个仅包含两条信息的类可能有点矫枉过正。
我建议不要仅将昵称用作 URL,因为如果nickname
值发生变化怎么办?用户 ID 似乎更合适,因为它不太可能改变,如果有的话。这就是 StackOverflow 对您的用户配置文件 ( stackoverflow.com/users/YOUR_USER_ID/YOUR_NICKNAME
) 的处理方式,如果您有以前的昵称,那么旧昵称将根据您的用户 ID 值映射到当前昵称。
简短的回答:这是不安全的
如果您不使用 SSL,则可能会特别劫持用户会话,这只是时间问题,并且取决于一些因素,例如黑客的专业程度,她拥有的设施等。作为一种解决方案,我建议您使用表单身份验证。
如果您仍然坚持使用 Session 来存储这种敏感信息,那么我建议生成一个临时密钥(例如 GUID)并将该密钥与用户对象关联一段特定的时间(您需要将此密钥存储在数据库中)。您还可以将更多信息绑定到此密钥,例如客户端的 IP 地址。将此临时密钥存储在 Session 中并仅在此密钥有效且 IP 地址没有可疑更改时处理请求。