发帖后this https://stackoverflow.com/questions/443988/simple-authorisation-login-capability-in-php不久前,我决定用 PHP 创建自己的注册/身份验证功能。我希望有人指出缺陷/改进机会,特别是围绕会话中存储的内容......
逻辑流程是:
1 - 用户注册时使用电子邮件作为用户名,“网站名称”构成他们可以访问的任何网址的一部分,密码至少包含 6 个字符,其中必须包含字母和数字(我知道这可能会更强)
2 - 假设用户和站点是唯一的,然后我将这两者以及随机生成的字符串(盐)存储在数据库的 auth 表中的一行中。然后,我获取用户密码,将盐连接到它,并将该加盐密码的 md5 哈希值存储在同一数据库行中
3 - 当用户登录时,我获取她输入的密码并将盐连接到它,创建该密码的 md5 哈希值,并将其与我存储在数据库中的内容进行比较 - 如果它们匹配,则用户已输入正确的密码,并且他们的用户名被写入会话
4 - 在每个请求中,我使用存储在会话中的用户名来查询数据库并读取与该用户关联的站点名称。然后,我将其与 url 本身中的站点名称进行比较,如果它们匹配,我将设置一个可供其余部分或脚本访问的变量(不是全局变量,它只能由我的控制器读取,该控制器决定用户是否可以看到特定页面)如果两个站点名称不匹配,用户将被重定向回登录
我担心的是,如果有人知道他们注册的用户名,是否可以写入会话,从而能够访问人们的页面?您将如何防止这种情况发生?
在有人指责我疏忽之前,顺便说一句,这是一个个人学习项目 - 我不会暴露任何客户数据!
为什么是 6 个字符?使其更大并至少需要 6 个(或更多)字符。没有理由将密码中的字符数限制为 6 个。
在会话中放置比用户名更多的内容。但为了安全地执行此操作,您必须在每次登录时更改盐:
A- 从登录页面:使用现有的盐进行名称和密码验证。如果有效,请使用新的盐更新用户表盐和密码(您拥有用户的密码,因此您可以再次对它和盐进行 md5)。将密码的md5写入会话。
B- 从任何其他页面:将用户和散列密码与数据库进行比较。如果不匹配,则重定向到登录页面。
这个想法的缺陷是用户无法在多台机器/浏览器上维护登录。
您的注册系统需要改进。您如何知道电子邮件地址有效?您如何知道注册用户拥有该电子邮件地址?您必须向包含返回您网站的链接的地址发送电子邮件,在允许帐户访问任何内容之前必须单击该链接。否则,有人可以使用其他人的电子邮件地址进行注册,并以该人的身份进行欺诈性声明,或者只是导致您的网站向该人发送垃圾邮件,导致您的网站关闭。
您可能还想研究验证码以限制脚本注册。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)