Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 行上的PDO if条件_Php_Pdo - Fatal编程技术网

Php 行上的PDO if条件

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

我正在使用PDO制作一个登录系统。我发现用户可以登录,尽管他们的信息不在数据库中

我的PHP代码如下:

 $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注入的攻击。您需要确保您也对密码进行哈希。我正在中途为你写这封信。你需要确保你也散列了你的密码。我正在中途为你写这封信。