PHP / SQL登录表单有问题

时间:2015-10-24 05:24:42

标签: php sql forms login

我正在尝试使用以下表单登录,但它总是跳转到无效的用户名。我在这里错过任何东西吗?

数据库连接:

$link   =   mysqli_connect("localhost","X","X","X");

if($link == false) {
    die("Error" .mysqli_connect_error());
}

登录脚本:

<?php
if (!isset($_POST['submit'])) {
?>
<!-- The HTML login form -->
<form action="<?=$_SERVER['PHP_SELF']?>" method="post">
    Username: <input type="text" name="username" /><br />
    Password: <input type="password" name="password" /><br />
    <input type="submit" name="submit" value="Login" />
</form>
<?php
} else {
    // Include database credentials
    include('../db_connect.php');
    $mysqli =   new mysqli($link);
    // check connection
    if ($mysqli->connect_errno) {
        echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>";
        exit();
    }

    $username   =   $_POST['username'];
    $password   =   $_POST['password'];

    $sql        =   "SELECT * from admin WHERE admin_email LIKE '{$username}' AND admin_password LIKE '{$password}' LIMIT 1";
    $result     =   $mysqli->query($sql);
    if (!$result->num_rows == 1) {
        echo "<p>Invalid username/password combination</p>";
    } else {
        echo "<p>Logged in successfully</p>";
        // do stuffs
    }
}
?>      

1 个答案:

答案 0 :(得分:2)

我不是百分百肯定,但我认为摆脱{}$username周围的$password应该解决问题,是的,使用LIKE登录是不好的。然后,我可以在用户名中键入%abijeet%,在密码字段中输入%p%,只要系统中有人称为abijeet,就会登录密码中包含字母p。

使用PDO

另外,过滤$ _POST的输入是个好主意。一般来说,我会请你放弃使用mysqli并查看PDO - http://php.net/manual/en/book.pdo.php

正确使用PDO参数可以保护您免受SQL注入攻击。

哈希密码

不要将密码存储在普通测试中,在保存之前将其哈希。点击此处 - http://php.net/manual/en/function.password-hash.php

更新 -

好的,所以指出{}没问题。另一件看起来很可疑的事情是条件检查。

我会把它改成这个 -

// Check the condition checking below!
if ($result->num_rows !== 1) {
    echo "<p>Invalid username/password combination</p>";
} else {
    echo "<p>Logged in successfully</p>";
    // do stuffs
}

这可能是运营商优先问题,无论如何更令人困惑。