错误的电子邮件验证

时间:2016-03-14 12:40:21

标签: php pdo

这是我关于stackoverflow的第一篇文章,我阻止你我不会说英语但我可以尝试清楚我的问题:)

我有一份PHP注册表,我有两份声明:

第一声明:搜索我的表格"用户"例如,如果没有其他伪/电子邮件。

$request = $db->prepare("SELECT * FROM users WHERE USE_USERNAME = :username AND USE_EMAIL = :email AND USE_PASSWORD = :password");
$request->bindParam(':username', $username, PDO::PARAM_STR);
$request->bindParam(':email', $email, PDO::PARAM_STR);
$request->bindParam(':password', $password, PDO::PARAM_STR);
$request->execute();
var_dump($request);
while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
    if ($username == $row['USE_USERNAME']){ ...

第二声明:如果用户输入了良好的数据,我可以将输入插入我的数据库。

$request = $db->prepare("INSERT INTO users (USE_USERNAME, USE_EMAIL, USE_PASSWORD) VALUES (:username, :email, :password)");
            $request->bindParam(':username', $username, PDO::PARAM_STR);
            $request->bindParam(':email', $email, PDO::PARAM_STR);
            $request->bindParam(':password', $pass_hache, PDO::PARAM_STR);
            $request->execute();

我的问题:

当我在输入中插入 ' OR 1 = 1' 时,我可以在数据库中插入相同的电子邮件地址。

我在这个网站上搜索了一个解决方案,并将这些行添加到我的数据库连接中:

    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

但我的数据插入即使我在我的PHP代码中放入错误消息(在我的while循环中使用Javascript弹出窗口)。

我是初学者,我正在寻找类似的问题,但如果您有答案,请感谢您的帮助:)

度过愉快的一天:)

编辑:当我在PHP中管理错误时,我会解释你:

while ($row = $request->fetchAll(PDO::FETCH_ASSOC)){
    if ($username == $row['USE_USERNAME']){
        ?>
        <script type="text/javascript">
            alert("Erreur#5 : Pseudonyme Faux !");  //Cas dans lequel les identifiants sont incorrects.
            document.location.href="subscribe.php";
        </script>
        <?php
        $error++;

它非常平庸,但我有一个从0开始的变量$ error,我为了停止PHP脚本而增加它。

唯一用户名和电子邮件的错误。在我的准备语句之前,我的错误有效,但现在我想从SQL注入中阻止我的表单。

1 个答案:

答案 0 :(得分:0)

这是一个有很多怪癖的问题:

1 - 您应该使用类似的方式验证您的输入 filter_var('bob@example.com', FILTER_VALIDATE_EMAIL) http://php.net/manual/en/function.filter-var.php

第二 - 你应该在你的数据库中放置一个唯一性约束,关于你的电子邮件 ALTER TABLE user ADD UNIQUE unique_index_email (email);

3 - 如果用户名和密码也相同,您的查询仅返回电子邮件。您应该只查询电子邮件。就像是 $request = $db->prepare("SELECT * FROM users WHERE USE_EMAIL = :email"); 因为这将确保如果存在1,则将返回

第4页 - 我强烈建议您不要在数据库中保留密码,只需保留散列值。你有加密强大的libs作为php libs,内置some应该可以做到这一点