[英]PHP/SQL login form having problems
我正在尝试使用以下表单登录,但是它总是跳转到无效的用户名。 我在这里想念什么吗?
数据库连接:
$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
}
}
?>
我不确定100%,但是我认为摆脱$username
和$password
周围的{}
应该可以解决此问题,是的,使用LIKE登录是不好的。 然后,我可以在用户名中键入%abijeet% ,在密码字段中键入% p%并登录,只要系统中有人叫abijeet且密码中带有字母p。
使用PDO
同样,过滤来自$ _POST的输入也是一个好主意。 通常,我会要求您放弃使用mysqli并研究PDO- http://php.net/manual/zh/book.pdo.php
正确使用带有参数的PDO可以保护您免受SQL Injection攻击。
散列密码
不要将密码存储在普通测试中,请在保存之前对其进行哈希处理。 在这里检查-http: //php.net/manual/zh/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
}
这可能是运算符优先级的问题,反而更令人困惑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.