0

我正在尝试使用 php 和 mysql 制作登录表单,但过去 3 天失败了。

我基本上有 php 表单,并且在同一页面上有用于将用户登录到网站的脚本。

表单.php

<form id="superAdminForm" method="post" action="">
   <input type="email" name="email" required class="txtInput" placeholder="Email..." autocomplete="off"/> <br />
   <input type="password" name="password" required class="txtInput" placeholder="Password..."/> <br />
   <input type="submit" name="submit" value="Enter" id="submit" />
</form>

form.php 的 php 代码

<?php
    require("../php_includes/db-connect.php");

    if (isset($_POST["submit"])) {
        $email = $_POST["email"];
        $password = $_POST["password"];

        $sql = "SELECT * FROM users WHERE email='$email' AND password='$password' LIMIT 1";
        $query = mysqli_query($con, $sql);

        $row = mysqli_fetch_array($query);

        if ($row['email'] == 1) {
            header("Location: admin-index.php");
        }
    }

    mysqli_close($con);

?>

问题是登录没有成功。我不知道背后的原因。所以请帮助我。也指导我在哪里犯错。

我是 PHP 新手,正在尽我所能应付我的知识。

4

3 回答 3

1

认为您需要做的是将视图逻辑与身份验证逻辑分开。将 PHP 块移动到它自己的文件中,并将表单的操作参数设置为该文件(相对位置)。

这是因为所有这些 php 代码在发送到客户端之前都由服务器解释,因此此表单实际上无法在同一页面中使用该 PHP 逻辑。

如果身份验证失败,您可能还需要编写一个后备,将您重定向回登录页面(或您想要的任何地方),否则用户将留下一个白屏。

编辑

正如其他人所说,您应该研究安全性,尤其是挂钩$_SESSIONs. 您的代码也需要一些工作。我认为$row['email'] == 1永远不会是真的,所以你的脚本会失败并且最终什么都不做。同样,添加一个 else 语句来处理身份验证失败。

至于修复,我建议$row['email'] == $email在 if 中进行比较,但这也会使您的 SQL 查询中的电子邮件检查变得多余。我建议重组你的逻辑。

于 2013-09-17T15:48:38.680 回答
1

1..谈安全

您的代码容易受到sql 注入的影响,因此即使它可以工作也没有用

在此处输入图像描述

^^ 来源

' or '1'='1' /* '会变魔术

所以要么使用 mysqli_real_escape_string函数手动转义字符串中的特殊字符,要么使用准备好的语句和参数化查询(推荐)。

2.. email='$email' AND password='$password' LIMIT 1";

那么为什么电子邮件不应该是唯一的,或者在登录时检查该电子邮件是否已经存在,如果存在而不是显示错误消息,例如(电子邮件已经存在)

所以你不需要使用limit 1这真的没有意义

3..为什么不设置登录id之类的,SESSION以便确定使用已登录

您上面的登录脚本什么都不做,它只是检查电子邮件和密码是否存在于数据库中

4.. 计划文本作为密码真的是个坏主意,而不是使用散列检查这个 你如何使用 bcrypt 在 PHP 中对密码进行散列?

好读

  1. 如何防止 PHP 中的 SQL 注入?
于 2013-09-17T15:51:32.397 回答
0
rows=mysqli_num_rows( $query);
if ($rows == 1) {
     header("Location: admin-index.php");
}

您正在将数组与 int 进行比较,请使用上面的代码。

于 2013-09-17T15:53:25.953 回答