我正在创建一个使用URL参数的各种登录系统。 参数设置没问题。我不知道问题是什么。 这是我的代码:
<?php
require_once("db_const.php");
$mysqli = new mysqli("dont", "try", "to login to", "my database");
# check connection
if ($mysqli->connect_errno) {
echo "<p>MySQL error no {$mysqli->connect_errno} : {$mysqli->connect_error}</p>";
exit();
}
$username = filter_input(INPUT_GET,"username",FILTER_SANITIZE_STRING);
$password = filter_input(INPUT_GET,"password",FILTER_SANITIZE_STRING);
$sql = "SELECT * from users WHERE username LIKE '{$username}' AND password LIKE '{$password}' LIMIT 1";
$result = $mysqli->query($sql);
if (!$result->num_rows == 1) {
echo "failed";
} else {
echo "success";
}
?>
答案 0 :(得分:-1)
尝试:
$sql = "SELECT * from users WHERE username='$username' AND password='$password'";
即使上面的代码解决了您的问题,它仍然非常危险,因为用户名和密码参数上的 SQL注入容易受到攻击它可以通过以下方式被利用:恶意用户可以通过中断引号并添加评估为true
的条件来绕过登录检查。
您可以使用mysqli::prepare
来克服错误。
$stmt = mysqli->prepare("SELECT * from users WHERE username=? AND password=?");
$stmt->bind_param("ss", $username,$password);
$stmt->execute();
答案 1 :(得分:-1)
您的代码存在一些问题。
问题是使用LIKE功能。您的用法是
SELECT * from users WHERE username LIKE '{$username}' AND password LIKE '{$password}' LIMIT 1
需要额外的规范来查找匹配位置等,例如:
SELECT ... WHERE username LIKE '%{$username}%'
在您使用的表单中,WHERE子句(如果等效于
)SELECT ... WHERE username = '{$username}'
此外,甚至(特别是)使用通配符也不建议使用LIKE,因为'tom'将匹配用户'tom'和'tommy',并且计数肯定不会是== 1.
我还会敦促您测试查询错误
if (!$result) {
echo 'An error occurred : $mysqli->error;
}
其他人已经在网址上提到了passwing用户名和密码的风险,请注意他们的意见。
此外,出于安全原因,不建议以普通形式存储密码数据库。有很多资源可以解释如何加密密码并使用加密值进行身份验证。