注册过程
用户填写表单的在线基本资料,包括电子邮件和密码,表单提交给register.php
register.php
增加了用户信息到一个临时位置,例如pending_users
表,其中具有用户提交的所有字段以及expiration
和activation_code
字段。这个代码可以是任何随机的,不可能猜到价值。例如:hash('sha1', mt_rand(10000,99999).md_rand(10000,99999))
。只是不要做任何预测的,如哈希当前时间,或用户名
register.php
将电子邮件发送到用户的方式将链接到activate.php
和包括激活码的URL。例如:example.com/activate.php?code=a2ef24...
电子邮件也应告知过期的用户(1〜12小时的有效性似乎确定我)
当用户点击链接时,她触发GET
请求activate.php
。在此过程中,用户证明了电子邮件地址的所有权
activate.php
从请求参数获取代码,例如:$code=$_GET['code']
。使用该代码,脚本将查询pending_users
表以查找与该代码匹配的记录。
如果找到该代码,请在继续之前检查它是否过期。到期会阻止其他更晚进入用户帐户的人完成注册。
如果代码有效,从匹配记录中捕获用户详细信息并从pending_users
表中删除该记录。
在常规users
表中填写匹配记录。在此之前,用户无法登录,因为登录脚本仅检查users
表,并忽略pending_users
表。
注册完成。
安全提示我:
对用户的保护,从来没有存储明文密码。当您从登记表接受它(例如:$_POST['pwd']
,做到:
$pwd = $_POST['pwd'];
//first validate; it should meet minimum requirements
$pwd_hash = password_hash($pwd, PASSWORD_DEFAULT); // <- the hash gets stored
后来,验证密码,这样做:
password_verify($cleartext_pwd, $pwd_hash);
它将返回true
如果密码是正确的; false
否则。
安全注意事项二:
为了您PROT 从不直接在用户数据库查询中插入用户提供的值。这意味着任何值从外部到达。不仅仅是用户名,电子邮件,密码......还包括您从用户处取回的值,如上面的activation_code
或cookie值或标头(例如User-Agent)。相反,学会使用准备好的语句。这将保护你免受SQL注入。
http://stackoverflow.com/questions/2088969/generating-confirmation-code-for-an-email-confirmation访问此 –
非常好的问题。您可以像我在下面的回答中那样简单地将链接构建为“example.com/activate.php?code=a2ef24 ...”。按照您看到的格式化的URL被重写为使用'.htaccess'规则在幕后看起来就像那样。 – BeetleJuice