php - 创建用于登录 PHP 的 Prepared 语句时出错

标签 php mysql sql authentication login-page

我一直遇到 PHP 提示“很抱歉,我们无法让您登录”的错误。根据我设置的条件之一,即使登录是正确的,因此我为避免 SQL 注入(inject)而准备的系统失败。

所以我的代码是这样的:

global $connected;

$post = filter_var_array($_POST, FILTER_SANITIZE_STRING);
$pwwd = $post['password'];
$usrn = $post['username'];
$usrn = mysqli_real_escape_string($connected, $usrn);
$pwwd = mysqli_real_escape_string($connected, $pwwd);

if (strlen($usrn) != 0 && strlen($pwwd) != 0 && !empty($post)) {
    $usrn = stripslashes($usrn);
    $pwwd = stripslashes($pwwd);
    $hashFormat = '$2ysomenumber$';
    $salt = 'somehashobviously';
    $hashF_and_salt = $hashFormat.$salt;
    $pwwd = crypt($pwwd, $hashF_and_salt);

    if (!mysqli_connect_errno()) {
        mysqli_select_db($connected, 'someDbname') or die('Database   select error');
    } else {
        die('Failed to connect to PHPMyAdmin').mysqli_connect_error();
    }

    $query = "SELECT Username, Password FROM users WHERE Username=? AND     Password=?";

    $stmt = mysqli_stmt_init($connected);

    if (mysqli_stmt_prepare($stmt, $query)) {
        //Some error in here somewhere

        mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
        mysqli_stmt_execute($stmt);

        mysqli_stmt_fetch($stmt);

        mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);

        if (strcasecmp($usrn, $check_usrn) == 0) {
            if ($pwwd == $check_pwd) {
                echo '<h1 class="text-center">Matches</h1>';
                print_r($row);
            }

        } else {
            echo "<h1 class=text-center>We're sorry we can't log you     in.</h1>";
        }

    }

} else { //This is for strlen boolean cond
    echo "<h1 class='text-center'>Both fields must not be empty.    </h1>";
}

我曾经使用没有准备好的语句的登录页面,但我意识到我需要这样做以获得更好的安全性。我的数据库工作正常,所以问题出在我添加评论“//这里某处有错误”的地方。

我是一名相对较新的 PHP 程序员,还是一年级的学生,在假期尝试大胆的新事物!将光明正大的看完所有的帮助我得到,谢谢!

最佳答案

首先我没有看到你的连接代码是这样的数据库连接。 $connected = msqli_connect(host,user,password,db_name) ; 不需要调用 mysqli_select_db() 函数。

其次,您正在检查来自 mysqli_connect_errno() 函数的连接,如果最后一个 mysqli_connect() 函数没有错误代码值,该函数返回 0 作为整数(不是 bool 值)。

第三是不需要Initializes prepare statement。

第四个是 mysqli_stmt_bind_reslut()mysqli_stmt_fetch() 之前。请参阅 manual 中的注释点

使用hash_equals() 函数来匹配密码而不是===。请参阅 crypt 中的警告部分

$connected = msqli_connect(host,user,password,db_name) ;
 if(!$connected)
 {
     die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
 } 
    echo "Your connection is  successful . "
 if($stmt = mysqli_prepare($connected,$query))
 {
       mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd);
       mysqli_stmt_execute($stmt);
       mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd);
       mysqli_stmt_fetch($stmt);
       /* Now do Your Work */

 } else 
   {
      /* still prepare statement doesn't work */
   } `

关于php - 创建用于登录 PHP 的 Prepared 语句时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41911254/

相关文章:

php - 尝试将Android中捕获的用户名和密码传递给PHP来查询MYSQL数据库

php - 如何解决尝试获取非对象的属性?

mysql - 将数据从一个表复制到另一个表

mysql - 在 ssh 命令中设置 autocommit=0

php - 返回的数组索引使用记录 ID 而不是行数

mysql - sql有函数

sql - MySQL - NULL 值检查和存储过程中的动态 SQL

php - 如何将文本添加到曲面图像?

php - 将多维 php 数组插入 mysqli 数据库

mysql - 我如何在左连接中排序?