为了更多地了解网络安全,我创建了一个故意不安全的脚本。
session_start();
if($_SESSION['userSession']) {
header("location: home.php");
}
if($_POST) {
$username = $_POST['username'];
$password = $_POST['password'];
$con = mysqli_connect("localhost", "myUsername", "myPassword", "myDatabase");
if(!$con) {
die("Error: " . mysqli_connect_error());
}
$query = "SELECT * FROM users WHERE username = '$username' && password='$password'";
$result = mysqli_query($con, $query);
$numResults = mysqli_num_rows($result);
if($numResults == 1) {
$row = mysqli_fetch_array($result, MYSQLI_ASSOC);
$_SESSION['userSession'] = $row['id'];
header("location: home.php");
} else {
echo "Error Logging In";
}
mysqli_close($con);
}
如您所见,我没有转义用户输入并且密码未经过哈希处理。 因此,我认为这应该是一个容易破解的登录。但是,我试图在用户名和密码字段中使用以下输入,但总是得到输出“Error Logging In”。
password' OR '1' = '1'";
我如何尝试绕过/破解我的登录脚本?
答案 0 :(得分:1)
如果我们直接使用sql语句来获取用户名和密码字段,那么它可以绕过' OR '1' = '1
模式,因为当你将' OR '1' = '1
放在用户名和密码字段中时,值继承到sql语句和在该声明中,' or '1' = '1
对于所有情况都是 true ,这是登录可以绕过的原因。
答案 1 :(得分:-1)
1.为避免sql注入问题,请使用PDO或prepared语句执行查询。 2.对存储在数据库中的密码添加加密
请参阅以下链接以获取准备好的声明: