SQL准备语句(PHP)

cad*_*ebe 5 php mysql

我试图了解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";
}
Run Code Online (Sandbox Code Playgroud)

为了防止SQL注入攻击,我试图实现准备好的语句,看看W3S网站和其他人.我想我需要更换

$query="SELECT user_name, password from visitors where user_name='".$_POST['user_name']."';";
Run Code Online (Sandbox Code Playgroud)

用这样的东西:

$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;
  }
} 
Run Code Online (Sandbox Code Playgroud)

我不确定修正案的有效性.此外,为了测试系统的漏洞是否已得到解决,我如何能够通过原始的,未经修改的代码访问系统?我试过了:

username: admin
password: ‘ or ‘1’=’1’ (and a number of other options too)
Run Code Online (Sandbox Code Playgroud)

man*_*niL 1

防止一阶、二阶和三阶注入的最佳方法是,我建议您使用 PDO 以及准备好的语句,同时使用正确的字符集并禁用“模拟准备语句”。有关 SQL 注入如何工作以及 PDO 如何阻止它的更多信息可以在此处找到