0

我正在尝试让我的电子邮件验证正常工作。就发送带有哈希链接的电子邮件进行确认而言,一切正常,但是一旦转到下面的 verify.php 链接,它就不会将我的数据库活动行从 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>';
}  
4

4 回答 4

1

您的代码不正确(使用 $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 等)。

于 2013-07-28T21:00:30.600 回答
1

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

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

目前,您依赖于一个已弃用的名为 register_globals 的指令。

于 2013-07-28T21:01:20.917 回答
1

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

在您的特定情况下, if 条件不起作用。该变量$search从未使用过。您$query$database->num_rows($query). 和是未定义的$email$email_hash

不要使用 $email = $_GET['email'];. 您必须清理所有用户输入,否则您将获得 sql 注入!

而是使用数据库特定的转义函数或准备好的语句。mysql->

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

于 2013-07-28T21:07:29.850 回答
0

您的 where 子句数组不好,应该是

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

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

于 2013-07-28T21:03:08.753 回答