我正在尝试使用以下表单登录,但它总是跳转到无效的用户名。我在这里错过任何东西吗?
数据库连接:
$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
}
}
?>
答案 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
}
这可能是运营商优先问题,无论如何更令人困惑。