php - 验证电子邮件确认

标签 php mysql pdo code-injection verification

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

此外,如果有人可以提供任何有关制作此注入(inject)证明的提示,我也会非常高兴。谢谢!

<?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'] 即可。再次感谢!

最佳答案

您也可以通过一个查询来完成所有操作,如果您在更新中写入相同的条件,则无需第一次查询:

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

关于php - 验证电子邮件确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17917247/

相关文章:

php - Zend_Pdf 操作 PDF 表单域

PHP在多维数组中找到第二大元素值

php - 数据未插入数据库

php - 如何使用 PHP 将数据库数据返回到现有 HTML 页面?

php - PDO SQLite 无法绑定(bind) NOT IN 表达式

php - 无法看到使用ajax和php从服务器响应的html代码

PHP 正则表达式 许多匹配项

java - 使用字符串 doInBackground(String...args)

php - 不能为空 - PhP PDO 函数

php - 如何正确使用 PDO::FETCH_SERIALIZE?