我不熟悉PHP / MySQL和电子邮件。而且我很确定这个问题已经在某个地方问了,但我找不到了。如果这令人不安,我很抱歉,并提前感谢你!
在将用户添加到数据库之前,是否可以做一些用户必须先点击电子邮件中的链接的内容?
你知道,对于某些网站,他们为每个电子邮件验证都有一个独特的网址(图中红色显示)?他们如何为每封电子邮件创建一个独特的网页?
非常感谢您的关注!如果可能的话,我不喜欢我可以复制和粘贴的直接脚本,因为我想找出自己:P但是请给我一些提示,因为我完全迷失了。
如果有任何不清楚的地方,请告诉我,我会尽力澄清它!
答案 0 :(得分:5)
注册流程
用户在线填写表单,其中包含电子邮件和密码等基本详细信息,并将表单提交至register.php
register.php
将用户信息添加到临时位置,例如pending_users
表,其中包含用户提交的所有字段以及expiration
和activation_code
}字段。此代码可以是任意随机,无法猜测的值。例如:hash('sha1', mt_rand(10000,99999).md_rand(10000,99999))
。只是不做任何可预测的事情,例如哈希当前时间或用户名
register.php
向用户发送一封电子邮件,其中包含一个链接到activate.php
且包含激活码的网址。例如:example.com/activate.php?code=a2ef24...
电子邮件还应通知用户过期(1至12小时有效期对我来说似乎没问题)
当用户点击该链接时,她会向GET
触发activate.php
请求。在这样做时,用户证明了电子邮件地址的所有权
activate.php
从请求参数中获取代码,例如:$code=$_GET['code']
。使用该代码,脚本会在pending_users
表中查询与该代码匹配的记录。
如果找到代码,请在继续之前检查它是否已过期。过期可以防止其他人迟到其他人进入用户的帐户完成注册。
如果代码有效,请从匹配记录中捕获用户详细信息,并从pending_users
表中删除该记录。
在常规users
表中写入匹配的记录。在此之前,用户无法登录,因为登录脚本仅检查users
表,并忽略pending_users
表。
注册完成。
安全提示I:
为您的用户'保护,永远不要以明文形式存储密码。当您从注册表单(例如:$_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
。
安全说明II:
为了保护您,永远不会直接在数据库查询中插入用户提供的值。这意味着从外部到达的任何值。不仅仅是用户名,电子邮件,密码......还有您从用户那里获得的值,例如上面的activation_code
或Cookie值或标头(例如用户代理)。相反,学会使用预备语句。这将保护您免受SQL注入。
答案 1 :(得分:1)
不确定在验证后是否可以在数据库中添加数据...
当我想做类似的事情时,我会在users表(或metas用户表)中创建一个数据,例如&#34; validate&#34;。 如果此数据为&#34; true&#34;,则用户已经进行了验证,他可以使用他的帐户。如果它仍然设置为&#34; false&#34;,则用户无法验证其帐户:他无法使用该帐户。
有了这个,你必须确保帐户在用户尝试登录时验证,但这不是什么大问题^^
希望它有用。
答案 2 :(得分:1)
这些不是一个独特的网站,只有一个脚本验证注册完成。传入请求(当用户点击链接时)通过服务器端&#34;请求重写&#34;将所有请求路由到同一脚本,以便随机令牌值可用作参数(参数)到脚本执行。
脚本的作用:它检查在用户实际注册之前,数据库中是否存在随机令牌值,并确定该值是否存在。
该脚本唯一要做的就是删除确认随机令牌和/或设置一个标志,表明注册用户已经通过点击链接实际确认了他的身份(电子邮件地址)。
简单直接。难以绕过,因为您无法猜测在没有收到电子邮件的情况下为已注册用户生成了什么随机令牌值。但是要考虑到攻击脚本使用匿名电子邮件服务(一次性电子邮件地址)来接收和评估此类确认请求(如果攻击者已知该过程)则是微不足道的。