2016-07-22 56 views
3

我不熟悉PHP/MySQL和电子邮件。我很确定这个问题已经被问到了,但我找不到它。所以我很抱歉,如果这是麻烦,并提前感谢你!PHP/Mail/MySQL:电子邮件确认注册

是否有可能做到这一点用户具有用户被添加到数据库之前,首先在电子邮件中的链接点击的东西???

你知道怎么样,对于一些网站,他们有一个独特的网络地址,为每个电子邮件验证(以红色显示的图片上的)?他们如何创建每个电子邮件都独一无二的网页?


图片记:https://kayako.atlassian.net/wiki/download/attachments/5734920/subs-validation.png?version=1&modificationDate=1291956283000&api=v2


enter image description here

谢谢了很多的关注!如果可能的话,我宁愿不要直接复制和粘贴脚本,因为我喜欢找出自己:P但请给我一些提示,因为我完全迷失了。

如果有任何不清楚,请告诉我,我会尽我所能来澄清!

+1

http://stackoverflow.com/questions/2088969/generating-confirmation-code-for-an-email-confirmation访问此 –

+0

非常好的问题。您可以像我在下面的回答中那样简单地将链接构建为“example.com/activate.php?code=a2ef24 ...”。按照您看到的格式化的URL被重写为使用'.htaccess'规则在幕后看起来就像那样。 – BeetleJuice

回答

4

注册过程

  1. 用户填写表单的在线基本资料,包括电子邮件和密码,表单提交给register.php

  2. register.php增加了用户信息到一个临时位置,例如pending_users表,其中具有用户提交的所有字段以及expirationactivation_code字段。这个代码可以是任何随机的,不可能猜到价值。例如:hash('sha1', mt_rand(10000,99999).md_rand(10000,99999))。只是不要做任何预测的,如哈希当前时间,或用户名

  3. register.php将电子邮件发送到用户的方式将链接到activate.php和包括激活码的URL。例如:example.com/activate.php?code=a2ef24...电子邮件也应告知过期的用户(1〜12小时的有效性似乎确定我)

  4. 当用户点击链接时,她触发GET请求activate.php。在此过程中,用户证明了电子邮件地址的所有权

  5. activate.php从请求参数获取代码,例如:$code=$_GET['code']。使用该代码,脚本将查询pending_users表以查找与该代码匹配的记录。

  6. 如果找到该代码,请在继续之前检查它是否过期。到期会阻止其他更晚进入用户帐户的人完成注册。

  7. 如果代码有效,从匹配记录中捕获用户详细信息并从pending_users表中删除该记录。

  8. 在常规users表中填写匹配记录。在此之前,用户无法登录,因为登录脚本仅检查users表,并忽略pending_users表。

  9. 注册完成。

安全提示我:

对用户的保护,从来没有存储明文密码。当您从登记表接受它(例如:$_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注入。

+0

在我发送的电子邮件中:指向验证页面的链接是:http:// localhost:8888/Brighten/admin/signup/validation.php?salt = cd16136f697c7264 但是当我实际点击它时,如:http:// localhost:8888/Brighten/admin/signup/validation.php?e6fc0ac809033f41 为什么他们摆脱我的GET功能? –

+0

没有更多的信息,我不能说。如果我是你,我会首先确认错误。确保脚本实际上正在接收请求;然后执行'print_r($ _ GET)'来仔细检查是否没有显示激活码。如果确实如此,请提出一个新问题并提出相关问题。 – BeetleJuice

1

不知道是否有可能在数据库中的验证之后添加DATAS ...

当我想要做这样的事情,我创建users表中的数据(或METAS用户表),如“验证”。 如果这个数据是“真实的”,那么用户已经做了验证,他可以使用他的账户。如果它仍然设置为“false”,那么用户不会验证他的帐户:他不能使用它。

有了这一点,你必须确保该帐户是当用户试图登录验证,但它不是一个大问题^^

希望它是有用的。

+0

这是非常有用的,这是一个很好的和简单的方法来做到这一点,非常感谢! –

1

这些不是一个独特的网站,只有一个脚本验证注册完成。传入的请求(当用户点击链接时)通过服务器端“请求重写”全部路由到相同的脚本,以便随机标记值可用作脚本执行的参数(参数)。

脚本的作用:如果随机令牌值不存在于数据库中,其中已经生成,并在用户实际注册之前存储它检查。

唯一剩下的那个脚本做的是去除确认随机令牌和/或设置指示注册使用实际上已经证实了他的标识(电子邮件地址)通过点击链接的标志。

简单而直接。很难绕过,因为你无法猜测哪些注册用户在没有收到电子邮件的情况下生成了随机令牌值。但是,考虑到攻击脚本使用匿名电子邮件服务(一次性电子邮件地址)来接收和评估这样的确认请求(如果攻击者知道该过程)是微不足道的。

+0

因此,创建一个脚本,每当用户注册时创建一个散列值,当用户点击邮件上的地址时,它会带走确认散列。 –

+0

我认为,我用“随机令牌”代替了“散列”,这更合适。是的,脚本通常会删除该令牌,因为它不再是必需的,如果令牌已在确认步骤_中正确提交,顺便说一句:您可以稍后在提供“忘记密码”功能时重新使用该数据库列:您创建一个_new_令牌并再次将该令牌从电子邮件地址发出,以允许用户一次登录,以便他可以重置密码。 – arkascha