即使输入了错误的信息,表单也会登录?

Posted

技术标签:

【中文标题】即使输入了错误的信息,表单也会登录?【英文标题】:Form logs in even with incorrect information entered? 【发布时间】:2013-06-22 19:11:22 【问题描述】:

首先,我只想对您的帮助表示感谢!我刚加入这个网站,你们中的很多人都非常有帮助和耐心! (:

所以,我的问题在于登录表单。即使输入了错误的信息,它也允许我登录。我是 pdo 的新手,我刚刚将所有 mysql 函数转换为 pdo,所以我很肯定我在某个地方出错了。

这是我的登录脚本:

<?php
//Login script
if (isset ($_POST["user_login"]) && isset($_POST["password_login"])) 
$user_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["user_login"]); //filter everything but numbers and letters
$password_login = preg_replace('^A-Za-z0-9)#i','', $_POST["password_login"]); //filter everything but numbers and letters
$password_login=md5($password_login);
$db = new PDO('mysql:host=localhost;dbname=socialnetwork', 'root', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT id FROM users WHERE username = '$user_login' AND password = '$password_login' LIMIT 1";
$db->prepare($sql);
if ($db->execute(array(
'$user_login' => $user_login,
'$password_login' => $password_login))); 
    if ($sql->rowCount() > 1)
        while($row = $sql->fetch($sql))
            $id = $row["id"];
        
        $_SESSION["id"] = $id;
        $_SESSION["user_login"] = $user_login;
        $_SESSION["password_login"] = $password_login;
        exit("<meta http-equiv=\"refresh\" content=\"0\">");
     else 
        echo 'Either the password or username you have entered is incorrect. Please check them and try again!';
        exit();
    
 
 
?>

这是表格:

<form action="home.php" method="post">
            <center><input type ="text" size="25" name="User_login" id="user_login" placeholder="username"/>
            <input type ="password" size="25" name="user_password" id="user_password" placeholder="password"/><br />
            <input type ="submit" name="button" id="button" value="login to your account!"/></center>
            </form>

关于如何解决这个问题的任何想法?

【问题讨论】:

你在学习什么 PDO 教程? 您的$password_login preg_replace 正则表达式字符串错误。 你应该正确地传递 $sql 中的变量,当你在带双引号的字符串中使用变量时,插入的值不是字符串 $varname 本身。 好吧,我被指示到这里:us3.php.net/manual/en/book.pdo.php,所以我一直在努力学习它,但它非常令人困惑。 我看到你的代码和the documentation之间的区别是$db-&gt;prepare( ... )返回一个stmt对象。在所有示例中,执行的是 stmt-object,而不是 $db-variable。但是,我不确定这是否有任何区别。这些示例也使用? 作为占位符,并使用数组Array( 'value 1', 'value 2' ) 而不是命名数组。也不确定这是否有什么不同。 【参考方案1】:
if ($sql->rowCount() > 1)

该代码无效,因为$sql 是一个字符串。我认为你应该有一个 $stmt = $db-&gt;prepare( ... ); 声明,然后有 $stmt-&gt;rowCount 代替(但我不是 100% 确定)。

【讨论】:

【参考方案2】:

PDO 准备好的语句看起来像(例如):

<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindValue(":username", $_POST['username']);
$stmt->bindValue(":password", md5($_POST['password']));
$stmt->execute();
$result = $stmt->fetchAssoc();

var_dump($result);
?>

你所拥有的不是准备好的陈述。看看这是否有帮助...

<?php
//Login script
if (isset ($_POST["user_login"]) && isset($_POST["password_login"])) 
$user_login = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["user_login"]); //filter everything but numbers and letters
$password_login = preg_replace('^A-Za-z0-9)#i','', $_POST["password_login"]); //filter everything but numbers and letters
$password_login=md5($password_login);
$db = new PDO('mysql:host=localhost;dbname=socialnetwork', 'root', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try 
  $user_id = false;
  $stmt = $db->prepare("SELECT id FROM users WHERE username = :user_login AND password = :password_login LIMIT 1");
  $stmt->bindValue(':user_login', $user_login);
  $stmt->bindValue(':password_login', $password_login);
  $stmt->bindColumn('id', $user_id);
  $stmt->execute();
  $row = $stmt->fetchAssoc();
  if($user_id)
    $_SESSION["id"] = $user_id;
    $_SESSION["user_login"] = $user_login;
    $_SESSION["password_login"] = $password_login;
    echo '<meta http-equiv="refresh" content="0">'; // see below
    // exit("<meta http-equiv=\"refresh\" content=\"0\">"); // this is WRONG!
   else 
    echo 'Either the password or username you have entered is incorrect. Please check them and try again!';
    exit();
  
 catch(PDOException $e) 
  die("PDO Exception: $e->getMessage()");
 catch(Exception $e) 
  die("Exception: $e->getMessage()");

?>

看到你准备好的陈述和我的不同了吗?您的查询更多的是编译后的查询,而不是准备好的语句(即使您使用的是prepare 方法)。

【讨论】:

根据the docs,他所做的并不是完全错误的(除了他在 $db 而不是 $stmt 对象上执行)。 这可能没有错,但这就像用0.50卡路里杀死一只蚂蚁!仅仅为了运行一个简单的查询而编写一个准备好的语句是矫枉过正的。 :(我为什么要处理他的错误?这只是一个例子! 我确实看到了区别!谢谢。我已经尝试了上面的代码,但不幸的是我收到了一条错误消息。你知道哪里有 PDO 的简化教程吗? ***.com/questions/1943069/… 这里有几个链接。

以上是关于即使输入了错误的信息,表单也会登录?的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:在用户上设置`backend`属性

即使一切都受到控制,也会出现不受控制的输入错误

为啥即使没有错误,表单也会出现错误消息?

即使我有错误Vuejs,提交表单后模态也会关闭

区分图像错误和表格错误

jsp登录页面,展示错误信息,刷新页面后错误依然存在解决方案