Mysql / PDO issue


Mysql / PDO issue

我正在尝试用PDO转换我的网站,这样sql注入就更安全了。

我在这里遇到了一个问题,因为我正在检查用户名是否尚未注册:

这是我的sql atm:

function isregistered($var,$methode) {
    $check1 = mysql_result(mysql_query("SELECT COUNT(gebruikersnaam) FROM leden_temp WHERE ".$methode."='".$var."'"),0);
    $check2 = mysql_result(mysql_query("SELECT COUNT(id) FROM leden WHERE ".$methode."='".$var."'"),0); 
    $check = $check1 + $check2; 
    if($check == 0) {
        return FALSE; 
    } else {
        return TRUE;
    }
}

我正试图通过这种方式将其转换为sql,作为一个pdo语句:

$check1 = $dbh->query("SELECT COUNT(gebruikersnaam) FROM leden_temp WHERE ".$methode."='".$var."'');

但我有点不知道这将如何与PDO合作?你们能帮我一点吗?

如果您选择使用准备好的语句,则会更安全。

$check1 =  $db->prepare('SELECT * FROM leden_temp WHERE gebruikersnaam = :var');
$arr1 = array(
    ':var'=>$var
);
$check1->execute($arr1);
$row_count_check1 = $check1->rowCount();

$check2 =  $db->prepare('SELECT * FROM leden WHERE gebruikersnaam = :var');
$arr2 = array(
    ':var'=>$var
);
$check2->execute($arr2);
$row_count_check2 = $check2->rowCount();

$check = $row_count_check1 + $row_count_check2; 
if($check == 0) {
    return FALSE; 
} else {
    return TRUE;
}

这样,SQL注入可以更容易地防止

我认为你使用的是Murfy的登录系统,所以如果你想使用相同的查询来检查电子邮件地址是否已注册,你需要将"gebruikersnaam"更改为"email"。

使用PDO不会自动使脚本更加安全,但它确实允许使用准备好的语句。

根据$var$method的值的来源,您可能仍然容易受到SQL注入的影响,因此您可能需要仔细验证输入是否符合预期。Prepared语句不能用于列名,因此部分不能参数化。

这是用于对第一个查询的一部分进行参数化的片段。同样的想法也可以用于第二个查询。

$stmt = $dbh->prepare("SELECT COUNT(gebruikersnaam) FROM leden_temp WHERE ${methode} = :methode");
$stmt->bindParam(':methode', $var);