【问题标题】:Easiest way for PHP email verification linkPHP电子邮件验证链接的最简单方法
【发布时间】:2011-04-17 05:38:19
【问题描述】:

我的网站 (colemansystems.psm2.co.uk) 上已经有一个高级用户登录/注册系统。但是,我想向新用户发送一封电子邮件,以验证他们的电子邮件地址。如果他们没有点击链接,他们将无法访问他们的帐户。我对PHP和MySQL是半经验,所以请深入解释。

编辑:我用于verify.php 文件的代码(用户使用 GET 点击的链接(例如,verify.php?d=51773199320))

$secret = $_GET['d'];
$result = mysql_query("SELECT valid FROM users WHERE secret=$secret");
while ($row = mysql_fetch_array($result))
{
    $valid = $row['valid'];
}
if ($valid == "") {
    echo"There seems to be a problem with the verification code.<br><br><br><br><br>";
}
elseif ($valid == "1")
{
    echo"Your account is already verified.<br><br><br><br><br>";
}
else
{
    mysql_query("UPDATE users SET valid = '1' WHERE secret=$secret");  
    echo "Thank you, your account is now verified and you are free to use the exclusive features!<br><br><br><br><br><br>";
}

这样安全吗?

【问题讨论】:

  • SO 不是为你构建东西的。当您遇到问题时,社区会提供帮助。
  • 不安全,因为至少是 sql 注入
  • 对不起,那是什么?这对它有什么影响?
  • 您可以通过在本网站或谷歌的搜索框中输入“sql injection”来阅读内容。

标签: php mysql email verification


【解决方案1】:

最简单的方法是根本不注册未经验证的用户。

向他们询问电子邮件地址,然后发送包含链接的电子邮件,该链接包含用哈希密封的该地址。收到此链接后,您可以开始注册过程。

类似的东西

$secret = "35onoi2=-7#%g03kl";
$email = urlencode($_POST['email']);
$hash = MD5($_POST['email'].$secret);
$link = "http://example.com/register.php?email=$email&hash=$hash";

并在您的register.php 中向注册表单添加 2 个隐藏字段 - 电子邮件和哈希,存储它们从 GET 接收到的值。

最后,处理注册和检查,

if (md5($_POST['email'].$secret) == $_POST['hash']) {
    //Continue registration.
}

【讨论】:

  • 这是一个聪明的解决方案,您不必将验证码存储在您的数据库中。
  • 我已经获取了您关于 borad 的信息,但让 php 生成了一个随机代码,然后将其插入到与用户在同一行的数据库中 + 有效字段设置为 0(不允许它们在)。当他们单击链接时,它会检查代码在数据库中的设置位置,并确保它尚未有效,然后将有效设置为 1。然后允许他们进入。我不确定它是否安全。
  • 虽然有点依赖于危险的单点故障,不是吗?任何掌握该秘密的人都可以通过他们喜欢的任何电子邮件进行注册。
  • 我更喜欢存储在数据库中的随机生成的代码,而不是哈希。哈希可以被破解,尤其是 md5 已经被破解多年(2008 年,之前你的答案)。破解用于电子邮件验证的哈希更容易,因为攻击者可以通过使用不同的电子邮件注册多个帐户并查看生成的哈希来收集数据。如果攻击成功,攻击者可以使用虚假电子邮件验证帐户。随机生成的代码更安全,但如果你要散列,至少使用更强大的东西,比如 sha256 或更好。
【解决方案2】:

对谁最简单 - 用户、编码员、计算机? 你在优化什么——按键的数量、代码的大小、用户体验?

最简单的编码可能是不安全的。 在给它发信之前,您应该检查电子邮件地址的正确性。

【讨论】:

  • 对我来说最简单的编码器。我希望它能够简单且安全地阻止黑客。
  • 那么您应该使用现有的经过验证且安全的库。像 PHPMailer。不要发明自行车。
【解决方案3】:

注册后创建一个散列字符串并将其保存到临时用户表中,使用此代码将该散列字符串发送到用户电子邮件地址

if(isset($_POST['register']))
{
$email_id=$_POST['email'];
$pass=$_POST['password'];
$code=substr(md5(mt_rand()),0,15);
mysql_connect('localhost','root','');
mysql_select_db('sample');

$insert=mysql_query("insert into verify values('','$email','$pass','$code')");
$db_id=mysql_insert_id();

$message = "Your Activation Code is ".$code."";
$to=$email;
$subject="Activation Code For Talkerscode.com";
$from = 'your email';
$body='Your Activation Code is '.$code.' Please Click On This link <a href="verification.php">Verify.php?id='.$db_id.'&code='.$code.'</a>to activate your account.';
$headers = "From:".$from;
mail($to,$subject,$body,$headers);

echo "An Activation Code Is Sent To You Check You Emails";
} 

然后创建一个验证页面,然后

if(isset($_GET['id']) && isset($_GET['code']))
{
$id=$_GET['id'];
$code=$_GET['id'];
mysql_connect('localhost','root','');
mysql_select_db('sample');
$select=mysql_query("select email,password from verify where id='$id' and code='$code'");
if(mysql_num_rows($select)==1)
{
    while($row=mysql_fetch_array($select))
    {
        $email=$row['email'];
        $password=$row['password'];
    }
    $insert_user=mysql_query("insert into verified_user values('','$email','$password')");
    $delete=mysql_query("delete from verify where id='$id' and code='$code'");
 }
}

如果您有任何问题,这里有一个完整的教程http://talkerscode.com/webtricks/account-verification-system-through-email-using-php.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2012-01-05
    • 2013-09-08
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    相关资源
    最近更新 更多