Php 行上的PDO if条件
我正在使用PDO制作一个登录系统。我发现用户可以登录,尽管他们的信息不在数据库中 我的PHP代码如下:Php 行上的PDO if条件,php,pdo,Php,Pdo,我正在使用PDO制作一个登录系统。我发现用户可以登录,尽管他们的信息不在数据库中 我的PHP代码如下: $error = ""; if(isset($_POST["submit"])){ if(empty($_POST["youremaildesktop"]) || empty($_POST["yourpassworddesktop"])) {$error = "Both fields are required.";} else{ $use
$error = "";
if(isset($_POST["submit"])){
if(empty($_POST["youremaildesktop"]) || empty($_POST["yourpassworddesktop"]))
{$error = "Both fields are required.";}
else{
$username=$_POST['youremaildesktop'];
$password=$_POST['yourpassworddesktop'];
$username = stripslashes($username);
$password = stripslashes($password);
$password = md5($password);
/*PDO Version*/
$resulter = $dbh->prepare("
SELECT uid
FROM customer
WHERE username = '$username'
AND password = '$password'
");
$resulter->fetchColumn();
if($resulter)
{
$_SESSION['localstorage'] = $username;
header("Location: userpage.php");
}
else {
$error = "Incorrect username or password.";
}
}
}
$dbh
PHP变量对应于我的数据库连接凭据。POST值对应于我主页上的登录表单
目标是仅当用户的凭据正确时,才将用户连接到
userpage.php
。但是,无论用户详细信息是否与数据库中的用户对应,我都可以登录。我可以通过修改代码添加以下内容来修复此查询:
$resulter->execute();
$resulted = $resulter->fetchAll();
if($resulted)
{
$_SESSION['localstorage'] = $username;
header('Location:vm913.php');
}
else { $error = "Incorrect username or password."; }
感谢@Options指出了代码中的漏洞。我半贴出这个问题也是为了看看人们对安全性的看法 我可以通过修改代码添加以下内容来修复此查询:
$resulter->execute();
$resulted = $resulter->fetchAll();
if($resulted)
{
$_SESSION['localstorage'] = $username;
header('Location:vm913.php');
}
else { $error = "Incorrect username or password."; }
感谢@Options指出了代码中的漏洞。我半贴出这个问题也是为了看看人们对安全性的看法 以下是我自己如何应对这种情况
if (isset($_POST['submit']))
{
$username = $_POST['youremaildesktop'];
$password = $_POST['yourpasswordesktop'];
if (!empty($username) && !empty($password))
{
$res = $dbh->prepare("SELECT * FROM `customer` WHERE `username` = ?");
$res->execute([$username]);
$row = $res->fetch(PDO::FETCH_ASSOC);
if ($res->rowCount() > 0)
{
if (password_verify($password, $row['password']))
{
$_SESSION['user_session'] = $row['uid'];
header('Location: vm913.php');
} else {
// echo incorrect pass
}
} else {
// echo no such user...
}
} else {
// echo something...
}
}
编辑,因为我错过了错误密码位的回音强>
您将看到password\u verify()
而不是使用md5,这确实是不推荐的。您还将看到,在我的查询中,我绑定了参数
注意:显然,在password\u-verify()
工作之前,您需要在注册端使用password\u-hash()
在一天结束时由你决定,但最好的做法是遮住你的后背
我还希望,始终将会话分配给userid,而不是用户名
作为一个可选的额外选项,可能还值得在您的系统中添加登录日志和失败日志。以下是我自己如何应对这种情况的
if (isset($_POST['submit']))
{
$username = $_POST['youremaildesktop'];
$password = $_POST['yourpasswordesktop'];
if (!empty($username) && !empty($password))
{
$res = $dbh->prepare("SELECT * FROM `customer` WHERE `username` = ?");
$res->execute([$username]);
$row = $res->fetch(PDO::FETCH_ASSOC);
if ($res->rowCount() > 0)
{
if (password_verify($password, $row['password']))
{
$_SESSION['user_session'] = $row['uid'];
header('Location: vm913.php');
} else {
// echo incorrect pass
}
} else {
// echo no such user...
}
} else {
// echo something...
}
}
编辑,因为我错过了错误密码位的回音强>
您将看到password\u verify()
而不是使用md5,这确实是不推荐的。您还将看到,在我的查询中,我绑定了参数
注意:显然,在password\u-verify()
工作之前,您需要在注册端使用password\u-hash()
在一天结束时由你决定,但最好的做法是遮住你的后背
我还希望,始终将会话分配给userid,而不是用户名
作为可选的额外功能,可能还值得向您的系统添加登录日志和失败日志。检查
var\u dump($result)代码>通过提供错误的详细信息,看看会发生什么?打印($result)你得到了什么我希望这不是一个实时脚本。。当您可以简单地使用password\u hash()
和password\u verify()
时,为什么要使用md5进行密码加密?您的查询也容易受到SQL注入检查var\u dump($resulter)的攻击代码>通过提供错误的详细信息,看看会发生什么?打印($result)你得到了什么我希望这不是一个实时脚本。。当您可以简单地使用password\u hash()
和password\u verify()
时,为什么要使用md5进行密码加密?您的查询也容易受到SQL注入的攻击。您需要确保您也对密码进行哈希。我正在中途为你写这封信。你需要确保你也散列了你的密码。我正在中途为你写这封信。