我不熟悉PHP / MySQL和电子邮件。我很确定这个问题已经问过什么地方了,但我找不到。因此,如果这是麻烦,我道歉,并感谢您提前!
在用户被添加到数据库之前,是否可以先单击电子邮件中的链接?
你也知道,对于某些网站来说,每个电子邮件验证都有一个独特的网址(图片上用红色显示)?他们如何创建一个网页,在每封电子邮件中都是独一无二的?
非常感谢大家的关注!如果可能的话,我不喜欢有直接的脚本,我可以复制和粘贴,因为我想找出自己:P,但请给我一些提示,因为我完全迷路了。
如果有什么不清楚的地方,请告诉我,我会尽力澄清的!
发布于 2016-07-22 07:28:54
注册过程
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
表。安全注意事项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:
为了保护您,永远不要在DB查询中直接插入用户提供的值。这意味着任何从外部到达的价值。不仅仅是用户名,电子邮件,密码。但也有您从用户那里得到的值,如上面的activation_code
值或cookie值或标头(例如用户代理)。相反,学习使用预先准备好的语句。这将保护您免受SQL注入的影响。
发布于 2016-07-22 07:15:18
不确定在验证之后是否可以在数据库中添加数据.
当我想做类似的事情时,我会在users表(或metas表)中创建一个数据,比如“验证”。如果该数据为“真”,则用户已经进行了验证,并且可以使用他的帐户。如果它仍然设置为"false",用户没有验证他的帐户:他不能使用它。
这样,您必须确保用户尝试登录时帐户是有效的,但这不是什么大不了的^^。
希望它有用。
发布于 2016-07-22 07:15:36
这些不是一个独特的网站,只有一个脚本验证注册定稿。传入请求(当用户单击链接时)通过服务器端“请求重写”将所有请求路由到同一个脚本,因此随机令牌值可用作脚本执行的参数(参数)。
脚本所做的工作:它检查数据库中是否存在该随机令牌值,在用户实际注册之前,该值已经生成并存储在数据库中。
对于该脚本,唯一要做的事情是删除确认随机令牌和/或设置一个标志,指示注册的用途实际上已经通过单击链接确认了他的标识(电子邮件地址)。
简单而直截了当。很难绕过,因为您无法猜测在没有收到电子邮件的情况下为注册用户生成的随机令牌值。但是,考虑到攻击脚本使用匿名电子邮件服务(一次电子邮件地址)接收和评估这样的确认请求是很简单的,如果攻击者知道该过程。
https://stackoverflow.com/questions/38520281
复制相似问题