我正在编写我的第一个用户界面,使用PHP进行登录和帐户管理,我一直坚持这个问题。当一个想法让我了解我的设计时,我即将完成创建新用户帐户的方法。
这是发生了什么。当用户尝试登录时,程序将获取字符串(尚未过滤)并使用我创建的用户类检查提供的用户名和密码是否在数据库中。如果在数据库中找到用户,则使用来自另一个类的算法对用户名进行加密,返回其凭据级别,并将这两个值与用户对象一起存储在$ _SESSION变量上。还创建了另一个会话变量,该变量模仿存储在对象中的凭证级别的值。如果要么彼此不平等,那么会话就被篡改了。
现在在用户类定义(方法列表)上,有一些方法允许对加密的用户名进行解码和编码;这让我想到了我的问题。考虑到用户对象是由这个类来定义的,它持有这些方法来解码和编码用户名,这会被视为安全风险吗?这个类与用于登录普通用户的类相同,所以我不确定......
答案 0 :(得分:1)
一般来说,用户名被视为公共信息。
我见过限制的唯一情况是,如果/当您希望其他人限制查看您的用户(姓名)列表时。
一般来说,这是你应该厌倦的密码。
此外,在会话中,您可能希望保存用户表行ID而不是用户名(这样您就可以限制攻击者知道用户实际上是谁)。 也就是说,这又是一个小小的预见。
答案 1 :(得分:0)
加密密码存在安全风险,明显违反了CWE-257。你应该是哈希密码,sha256是一个很好的选择。此外,您的会话中唯一需要存储的内容是$_SESSION['logged_in']=True
。在会话中存储用户名/密码是一种非常糟糕的做法。默认会话处理程序将此信息存储在/tmp/SESSION_ID
。