验证电子邮件确认

时间:2013-07-29 06:23:44

标签: php mysql pdo code-injection verification

我在让用户帐户验证时遇到问题。我得到它插入数据,然后发出一个确认链接但是当它被点击在电子邮件中它不会更新从0到1的'活动'行。我整晚都在搞乱它,这可能是一些简单的但是无论哪种方式,如果有人可以提供帮助,我会非常感激。

如果有人能提供任何关于制作这种注射证据的提示,我也会非常高兴。谢谢!

<?php

require ('classes/class.db.php');
require ('classes/class.pass.php');


try {

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 = $db->num_rows( $query );

    if($match > 0){  

    $stmt = $db->prepare('UPDATE users (active) VALUES (:active) WHERE active = 0');
    $status = $stmt->execute(array(
    ':active' => 1));

        if( $status )
        {
            echo '<p>Your account has been activated, you can now login</p>';
        }
    }

}else{  
    echo '<p>Your account is already activated</p>';
}  


} catch (PDOException $e) {
        die($e->getMessage());
    }

?>

更新#1

尝试了Akam的建议,但仍然遇到了一些错误。以下是我的陈述。

$stmt = $db->prepare("UPDATE users SET active ='1' where active = '0' and email=:email AND email_hash=:email_hash");
$status = $stmt->execute(array(
':email' => $_GET['email'],
':email_hash' => $_GET['email_hash']
));

更新#2

似乎问题是$_GET['email_hash'],它无法回显或存储在变量中。它不会从signup.php页面获取随机哈希字符串并将其传递到verify.php页面,但电子邮件地址完全没问题。我有点困惑,并希望有人为我澄清这一点。感谢。

更新#3

问题就像将$_GET['email_hash']转为$_GET['hash']一样简单。再次感谢!

2 个答案:

答案 0 :(得分:0)

您也可以通过一个查询执行所有操作,如果您在更新中编写相同的条件,则无需先进行查询:

"UPDATE users SET active ='1' where active = '0' and email=:email AND hash=:email"

答案 1 :(得分:0)

您的UPDATE查询包含syntax error。尝试将查询更改为

$stmt = $db->prepare('UPDATE users SET active=:active WHERE active=0 AND email=:email AND email_hash=:email_hash');

然后在语句执行期间在关联数组中包含$email$email_hash

作为旁注,请isset($var) && !empty($var) roughly equivalent来撰写!empty($var)。根据文档,因为

empty($var)

一致
!isset($var) || $var == false,

以下!empty($var)isset($var) && $var != false一致。