SQL准备语句(PHP)

5

我正在努力了解SQL注入的原理,以及如何防范它。HTML登录页面包含一个表单,其中有用户名和密码字段以及提交按钮。使用MySQL数据库时,PHP代码如下:

$conn = mysqli_connect($Host, $User, $Password, $DbName);
if (!$conn) {
 echo "Database connection error.";
 exit;
}
$query = "SELECT user_name, password from visitors where user_name = '".$_POST['user_name']."';";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
$user_pass = md5($_POST['pass_word']);
$user_name = $row['user_name'];
if(strcmp($user_pass,$row['password']) != 0) {
 echo "Login failed";
}

为了防止SQL注入攻击,我正在尝试实现预处理语句。查看了W3S网站和其他网站后,我认为需要替换掉原来的SQL查询语句。
$query="SELECT user_name, password from visitors where user_name='".$_POST['user_name']."';";

使用类似以下的东西:
$stmt = $conn->prepare("SELECT user_name, password from visitors where  user_name= ?");
if ($stmt->execute(array($_GET[‘user_name’]))) {
  while ($row = $stmt->fetch()) {
    $user_name = $row;
  }
} 

我对修改的有效性感到不确定。 此外,为了测试系统的漏洞是否已得到解决,我应该如何通过原始、未修改的代码访问系统?我尝试过:

username: admin
password:  or ‘1’=’1’ (and a number of other options too)

1
如果你输入的是 ‘ or ‘1’=’1’,那么这些被称为卷曲引号,并且会导致解析错误。请使用普通的单引号 '。除非这只是一个错误的粘贴。 - Funk Forty Niner
1
那个注入不会“获得访问”系统,因为密码比较仍然会失败。但是,想象一下使用用户名';drop table visitors;--登录而不是使用用户名admin登录。 - David
2
还有这个:https://xkcd.com/327/ ... 需要在每个关于SQL注入的问题下面都加上一条评论。 - CD001
很高兴看到人们关注安全问题,我建议使用比md5更安全的东西,因为它是一种非常弱的哈希解决方案,如果发生数据被盗的情况,很容易恢复所有用户的密码。 - Gogolex
关于md5的观点是正确的。昨天我的一个朋友提到了这个问题。 - cadebe
显示剩余4条评论
1个回答

1

为了预防一、二、三级注入攻击,我建议您在使用适当的字符集并禁用“模拟准备语句”的情况下,使用PDO和预处理语句。有关SQL注入攻击的工作原理以及PDO如何防止它的更多信息可以在这里找到


这个视频在理解PDO和预处理语句方面非常有帮助:https://www.youtube.com/watch?v=GBDbclDfc84 - cadebe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接