无法从数据库中为我的登录页面获取数据:( [重复]

Posted

技术标签:

【中文标题】无法从数据库中为我的登录页面获取数据:( [重复]【英文标题】:Can't get data from database for my login page :( [duplicate] 【发布时间】:2020-01-27 11:53:00 【问题描述】:

我正在尝试从数据库中为我的登录页面获取数据,但似乎无法这样做。它一直告诉我我的用户名或密码错误。

我是这个领域的初学者,我的代码来自 youtube。

form1.html

<!DOCTYPE html>
<html>
<head>
 <title>Login Site</title>
</head>
<body>
<form method="POST" action="connect2.php">
Username : <input type="text" name="username"><br><br>
Password : <input type="password" name="password"><br>
<input type="submit" value="Login" name="submit">
</form>
</body>
</html>

connect2.php

<?php
$con = mysqli_connect("localhost", "root", "") or die("Failed to connect to MySQL."); 
mysqli_select_db($con, "abc") or die("Database does not exist."); 
//require ('sql_connect.php');
if (isset($_POST['submit']))
    $username=mysqli_escape_string($_POST['username']);
    $password=mysqli_escape_string($_POST['password']);
    if (!$_POST['username'] | !$_POST['password']) 
        echo ("<SCRIPT LANGUAGE='javascript'>
            window.alert('You did not complete all of the required fields')
            window.location.href='form1.html'
        </SCRIPT>");
        exit();
    
    $sql= mysqli_query("SELECT * 
                        FROM `account` 
                        WHERE username = $username 
                        AND password = $password ");
    if(mysqli_num_rows($sql) > 0) 
        echo ("<SCRIPT LANGUAGE='JavaScript'>
            window.alert('Login Succesfully!.')
            window.location.href='form1.html'
        </SCRIPT>");
        exit();
    else
        echo ("<SCRIPT LANGUAGE='JavaScript'>
            window.alert('Wrong username or password. Please re-enter.')
            window.location.href='form1.html'
        </SCRIPT>");
        exit();
    
else

?>

我认为 PHP 编码有问题,因为我不断收到“错误的用户名和密码”消息。

更新:我的数据库截图https://imgur.com/a/wPWdHDc

【问题讨论】:

使用logical OR operator(||) insted of | 您的脚本对SQL Injection Attack 攻击开放。即使是if you are escaping inputs, its not safe!,您也应该考虑在MYSQLI_PDO API 中使用prepared parameterized statements,而不是连接值 良好的代码缩进会帮助我们阅读代码,更重要的是它会帮助您调试代码 Take a quick look at a coding standard 为您自己谋福利。您可能会被要求在几周/几个月内修改此代码,最后您会感谢我的。 纯文本密码是一个非常糟糕的主意:PHP 提供了password_hash()password_verify(),为了您的用户安全,请使用它们。 【参考方案1】:

作为快速修复,在用户名和密码变量周围加上引号:

SELECT * FROM `account` WHERE username = '$username' AND password = '$password'

一些改进此代码的提示:

使用准备好的语句来避免 SQL 注入 不要以纯文本形式存储密码,将其散列(使用盐)

另外,你的第一个条件有错误,你使用|,这是一个按位运算符,而不是||,这是一个逻辑或运算符

【讨论】:

另外,应该使用 PHP header 来重定向而不是 javascript 我还是这个领域的初学者,我还没有学过用盐散列密码。 我试过在变量周围加上引号,还是不行…… Joffrey 最好建议使用 password_hash()password_verify() 并让它在内部创建一个非常好的盐,而不是简单地建议用盐散列。【参考方案2】:

我认为

"SELECT * FROM account WHERE username = $username AND password = $password "

应该是

"SELECT * FROM account WHERE username = \"$username\" AND password =\"$password\""

【讨论】:

以上是关于无法从数据库中为我的登录页面获取数据:( [重复]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 .htaccess 中为我的 php 网站编写重写规则

我无法在 Unity 中为我的预制件分配脚本

无法从sql数据库中获取结果[重复]

如何在rest框架中为我的注册视图编写登录视图?

在 iOS 6 中为我的应用程序登录 Facebook [关闭]

我在邮递员中为我的 URL 使用啥?