Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有2个会话(用户ID、用户名)的用户,不安全?_C#_Asp.net_Security_Session_Web - Fatal编程技术网

C# 具有2个会话(用户ID、用户名)的用户,不安全?

C# 具有2个会话(用户ID、用户名)的用户,不安全?,c#,asp.net,security,session,web,C#,Asp.net,Security,Session,Web,如果有人登录,我会保存2个会话 Session["userid"] Session["nickname"] 会话[“userid”]用于从数据库检索有关用户的数据 会话[“昵称”]用于将用户重定向到其个人资料页面 (示例:www.test.com/mike(在本例中,“mike”是昵称) 我想知道这个想法是否安全?建议这样做,还是有其他更好的选择?我看不出有什么大问题,除非某个用户的昵称以后可以更改。在这种情况下,用户档案的URL将更改,您应该适当地调整所有链接 对于URL,我会使用UID。并

如果有人登录,我会保存2个会话

Session["userid"]
Session["nickname"]
会话[“userid”]
用于从数据库检索有关用户的数据

会话[“昵称”]
用于将用户重定向到其个人资料页面

(示例:
www.test.com/mike
(在本例中,“mike”是昵称)


我想知道这个想法是否安全?建议这样做,还是有其他更好的选择?

我看不出有什么大问题,除非某个用户的昵称以后可以更改。在这种情况下,用户档案的URL将更改,您应该适当地调整所有链接


对于URL,我会使用UID。并将其存储在会话变量中。例如,如果用户更改其中一个会话变量的值,会发生什么情况?您会在每次页面加载中验证它吗?

数据是安全的还是不安全的,如果数据存储在两个单独的
会话
对象中并不重要所以,如果用户ID或昵称可以被某人恶意使用,那么它是不安全的;否则就不安全了

我通常将用户信息存储在一个名为
LoggedOnUser
Session
对象中,该对象表示一个类的实例。在您的情况下,创建一个只包含两条信息的类可能会有些过分


我建议不要将昵称单独用作URL,因为如果
昵称
值发生变化怎么办?用户ID似乎更合适,因为这不太可能发生变化。StackOverflow就是这样处理您的用户配置文件的(
StackOverflow.com/users/your_User_ID/your_昵称
),如果您有以前的昵称,则旧昵称将根据您的用户ID值映射到当前昵称。

您不是在会话中存储两个会话,而是在会话中存储两个变量。拥有两个变量从根本上讲没有什么错,我唯一的想法是更新
昵称时会发生什么每次使用
userid
作为键从数据库中查找昵称不是比在登录后固定静态变量更好吗


话虽如此,在这个会话中使用表单身份验证票证比使用表单身份验证票证更安全。请参阅此处,了解一些好的理由:

简短回答:这是不安全的

如果不使用SSL,用户会话可能会被劫持,这只是时间问题,取决于一些因素,如黑客的专业程度、她有什么设施等。
作为一种解决方案,我建议您使用。
如果您仍然坚持使用会话来存储此类敏感信息,那么我建议生成一个临时密钥(例如GUID),并将该密钥与用户对象关联一段特定时间(您需要将此密钥存储在db中)。您还可以将一些其他信息绑定到此密钥,例如客户端的IP地址。仅当此密钥有效且IP地址没有可疑更改时,才将此临时密钥存储在会话中并处理请求。

您的意思是“在这种情况下,'Mike'是昵称”,对吗?Woops,是的,我指的是昵称,不是用户名。谢谢。你不需要存储用户id,只要登录到任何页面,就可以使用Membership.GetUser(HttpContext.Current.user.Identity.Name)检索用户id.ProviderUserKey可能重复的@andleer会话本质上是不安全的。直接获取cookies或嗅探网络,您可以模拟其他用户。另外,处理此问题的常用方法是创建一个URL,如www.test.com/123/mike,其中123是用户ID,mike是昵称。然后,您的应用程序将忽略mike部分,然后st查看id…但URL仍然是人类可读的。此页面的URL如下所示:/questions/123/user和两个…等等。如果编辑地址栏并更改末尾的纯文本部分,页面仍然会加载,因为它被忽略了。@JohnGibb-关于人类可读的REST-like URL,我同意这一点,这一点很好。“如果用户更改其中一个会话变量的值,会发生什么情况”-用户会怎么做?我们看不到页面的整个代码,因此我们不知道这些变量是如何设置和修改的。可能通过发送POST/GET参数,该值在会话变量中更改,但在DB中不会更改。。。