PHP登录脚本无法正常工作

时间:2013-09-17 15:42:44

标签: php mysql

我正在尝试使用php和mysql创建一个登录表单,并且在过去的3天内失败了。

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

form.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新手,我正尽力应对自己的知识。

3 个答案:

答案 0 :(得分:1)

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

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

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

修改

正如其他人所说,你应该研究安全性,尤其是挂钩$_SESSION。您的代码也需要一些工作。我认为$row['email'] == 1永远不会成真,所以你的剧本会失败并最终无所作为。再次,添加else语句来处理身份验证失败。

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

答案 1 :(得分:1)

1 .. 谈论安全性

您的代码容易受到sql injection的攻击,因此即使它无效,

也是如此
  

enter image description here

^^ source

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

所以要么使用mysqli_real_escape_string功能要手动转义字符串中的特殊字符,要么使用 prepared statements和参数化查询(推荐)。

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

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

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

3 .. 为什么不在SESSION中设置登录ID或其他内容,以便您可以确定已记录使用

您的上述登录脚本不执行任何操作,只需检查天气电子邮件和密码是否存在于数据库中

4 .. 将文字计划为密码是非常糟糕的主意而是使用哈希检查此How do you use bcrypt for hashing passwords in PHP?

好读

  1. How can I prevent SQL injection in PHP?

答案 2 :(得分:0)

rows=mysqli_num_rows( $query);
if ($rows == 1) {
     header("Location: admin-index.php");
}

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