Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的简单邮件确认_Php_Email_Identity - Fatal编程技术网

PHP中的简单邮件确认

PHP中的简单邮件确认,php,email,identity,Php,Email,Identity,我基本上想做的是通过使用邮件地址确认用户的身份,然后如果身份得到验证,则执行某些数据库操作。 我想生成一个确认码,并以URL的形式发送到电子邮件地址。 但我不想为确认码维护数据库。我如何使用加密来实现这一点。有什么想法吗?你可以用一些秘密盐将相关电子邮件地址散列,并将其作为链接中的令牌。然后在验证时,重复同样的过程。最好的方法是在数据库中有一个名为“activation”的varchar字段 所以你可以保留“确认码”。用户激活其帐户后,您将其更新为“1”。因此,如果字段为“1”;用户已激活其帐户

我基本上想做的是通过使用邮件地址确认用户的身份,然后如果身份得到验证,则执行某些数据库操作。 我想生成一个确认码,并以URL的形式发送到电子邮件地址。
但我不想为确认码维护数据库。我如何使用加密来实现这一点。有什么想法吗?

你可以用一些秘密盐将相关电子邮件地址散列,并将其作为链接中的令牌。然后在验证时,重复同样的过程。

最好的方法是在数据库中有一个名为“activation”的varchar字段

所以你可以保留“确认码”。用户激活其帐户后,您将其更新为“1”。因此,如果字段为“1”;用户已激活其帐户。否则,仍然会有确认代码,用户的帐户不会被激活。因此,至少会有一列用于激活过程。

它应该如下所示:

    <?php

    $salt = "this is a secret key!!!";

    if(isset($_GET["confirm"]) && isset($_GET["email"])){
        $confirm = $_GET["confirm"];
        $to_email = $_GET["email"];

        if(sha1($salt.$to_email) == $confirm){
            // this mail is confirmed, now do some db work
            // update_db ... ();
        }else{
            die("error: mail not confirmed");
        }


    }elseif(isset($_GET["email"])){
        $to_email = $_GET["email"];

        $confirm_link = $_SERVER["PHP_SELF"]."?confirm=".urlencode(sha1($salt.$to_email))."&mail=".urlencode($to_email);
        $msg = "to confirm ... click the link: \n ".$confirm_link;
        mail($to_email,"pls. confirm your mail",$msg);
    }else{
        die("error message");
    }
    ?>


顺便说一句,临时存储确认码没有什么错。只是说。当验证它时,他会解码链接中的变量吗?这样安全吗?如果安全更重要,我会像OP不希望的那样管理代币。但他可能有一种秘密的盐,用于服务器端创建散列。对我来说似乎很安全。例如,我不建议用这种方法来处理丢失的密码和安全密钥,但我想这对电子邮件验证来说可能没问题。@Mahn,你熟悉哈希吗?这正是您使用value+salt的场景(显然,您的salt是秘密的)。这是验证由不可信来源提供的数据真实性的方法。这是一种极为常见的做法。是的,我是,但严格来说,这仍然不是最安全的方法,因为如果攻击者发现了秘密盐和使用的算法,他可能会生成自己的密钥(这是一种不太可能的情况,但并非不可能);然而,创建和存储一个随机密钥会使这种情况(同样不太可能)变得(几乎)不可能,因为攻击者不知道散列的“来源”。