发布后这一段时间回来,我决定在PHP中创建我自己的注册/验证能力.我希望任何人都能指出改进的缺陷/机会,特别是在会议中存储的内容......
逻辑流程是:
1 - 用户注册使用电子邮件作为用户名,"网站名称"然后构成他们将访问的任何网址的一部分,密码至少6个字符,必须包含字母和数字(我知道这可能更强)
2 - 如果用户和站点是唯一的,那么我将这两者以及随机生成的字符串(salt)存储在我的数据库的auth表中的一行中.然后,我获取用户密码,将salt连接到它,并将此salted密码的md5哈希存储在同一数据库行中
3 - 当用户登录时,我获取她输入的密码并将盐连接到它,创建一个md5哈希,并将其与我存储在数据库中的密码进行比较 - 如果它们匹配,则用户已输入正确的密码,并将其用户名写入会话
4 - 在每个请求中,我使用会话中存储的用户名来查询数据库并读取与此用户关联的站点名称.然后我将它与url本身的站点名称进行比较,如果它们匹配,我设置一个可供其余或脚本访问的变量(不是全局变量,它只能由我的控制器读取,它决定用户是否可以看到特定页面)如果两个站点名称不匹配,则将用户重定向回登录
我担心的是有人可以写入会话,因此如果他们知道他们注册的用户名,就可以访问人们页面吗?你会如何防止这种情况发生?
在任何人指责我疏忽之前,这是一个个人学习项目的方式 - 我不会暴露任何客户数据!
为什么6个字符?使其更大,并且至少需要6个(或更多)字符.将密码中的字符数限制为6没有任何借口.
在会话中放置超过用户名.但要安全地执行此操作,您必须在每次登录时更改盐:
A-从登录页面:使用现有盐进行名称和密码验证.如果有效,用新盐更新用户表盐和密码(你有来自用户的密码,所以你可以md5和盐再次).将密码的md5写入会话.B-从任何其他页面:将用户和散列密码与数据库进行比较.如果它们不匹配,请重定向到登录页面.
这个想法的缺陷是用户无法在多台机器/浏览器上维护登录.
您的注册系统需要工作.你怎么知道这个电子邮件地址有效?您如何知道用户注册拥有电子邮件地址?您必须向包含返回您网站的链接的地址发送电子邮件,在您允许帐户访问任何内容之前必须单击该链接.否则,有人可以在其他人的电子邮件地址下注册,向该人提出欺诈性声明,或者只是让您的网站向该网站发送垃圾邮件.
您还可能需要调查CAPTCHA以限制脚本注册.