确认电子邮件验证


Confirm Email Verification

我正在尝试让我的电子邮件验证工作。只要发送带有哈希链接的电子邮件进行确认,一切都可以,但一旦它转到下面的verify.php链接,它就不会将我的DB活动行从0更新为1。有什么建议吗?

if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){  
    // Verify data  
    $search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'";
    $match = $database->num_rows( $query );
    if($match > 0){  
        //Fields and values to update
        $update = array(
            'active' => 1 
        );
        //Add the WHERE clauses
        $where_clause = array(
            'email' => '$email', 
            'email_hash' => '$email_hash',
            'active' => '1'
        );
        $updated = $database->update( 'users', $update, $where_clause, 1 );
        if( $updated )
        {
            echo '<p>Your account has been activated, you can now login</p>';
        }
    }
}else{  
    echo '<p>Your account is already activated</p>';
}  

您的代码不正确(使用$email/$email_hash但没有声明它们)这就是它的工作方式:

if(isset($_GET['email']) && !empty($_GET['email']) AND isset($_GET['email_hash']) && !empty($_GET['email_hash'])){  
    // Verify data  
    $email = $_GET['email'];
    $email_hash= $_GET['email_hash'];
    $search = "SELECT email, email_hash, active FROM users WHERE email='".$email."' AND hash='".$email_hash."' AND active='0'";
    $match = $database->num_rows( $query );
    if($match > 0){  
        //Fields and values to update
        $update = array(
            'active' => 1 
        );
        //Add the WHERE clauses
        $where_clause = array(
            'email' => '$email', 
            'email_hash' => '$email_hash',
            'active' => '1'
        );
        $updated = $database->update( 'users', $update, $where_clause, 1 );
        if( $updated )
        {
            echo '<p>Your account has been activated, you can now login</p>';
        }
    }
}else{  
    echo '<p>Your account is already activated</p>';
}

我想补充一点,在生产阶段,您必须转义并验证所有传入的数据(POST、GET等)。

您应该在if子句中定义$email和$email_hash。

$email = $_GET['email'];
$email_hash = $_GET['email_hash'];

目前,您所依赖的是一个不推荐使用的指令register_globals。

您犯了一些非常明显的错误。首先,你应该打开错误。您必须使用error_reporting(-1)ini_set('display_errors', true)来查看和查找错误。这是至关重要的,否则你将很难找到错误。一旦应用程序处于生产环境中,请确保将其关闭。

在您的特定情况下,if条件不起作用。从不使用变量$search。您在$database->num_rows($query)中引用了一个未定义的$query变量。并且CCD_ 6和CCD_。

不要使用$email = $_GET['email'];。你必须净化所有的用户输入,否则你会得到sql注入!

相反,请使用特定于数据库的转义函数或准备好的语句。Mysql->

$email = mysql_real_escape_string($_GET['email']);

where子句数组不正确,应该是

$where_clause = array(
    'email' => $_GET['email'], 
    'email_hash' => $_GET['email_hash'],
    'active' => 0 // not 1
);

顺便说一句,您似乎正在使用一些抽象库进行数据库查询——尝试将选择查询更改为使用占位符,并让库为您转义变量。现在,您的代码看起来容易受到SQL注入的攻击。