首页 > 解决方案 > {} 在 php 中包裹我的变量是否会降低 sql 注入风险?

问题描述

我正在使用 php 和 mysql 为一个简单的登录页面编写一段代码,因此试图自己进行渗透测试,我在查询中使用花括号将变量 $password 和 $username 括起来,它完全阻止了我绕过它的尝试。
我知道我可以使用mysqli_real_escape_string准备好的语句,并且我没有询问如何在这里保护我的代码,我想以这种方式检查它并知道黑客如何渗透这个确切的代码。我尝试传递' or 1=1 -- -,就像变量周围没有大括号但它没有工作也尝试}' or 1=1 -- -但无法绕过它。所以问题是大括号增强了安全性?如果不是,注入的有效载荷是什么

下面的代码是我用来连接我的数据库的代码。

<?php 

if(isset($_POST['login'])){


$connection=mysqli_connect('localhost','root','','users');    
$username=$_POST['username'];
$password=$_POST['password'];

$query="SELECT * FROM users WHERE username='{$username}' AND password='{$password}'";
$select_user_query=mysqli_query($connection,$query);
$select_user_result=mysqli_fetch_result($select_user_query);    
if(!$select_user_result){
    die("Username not found");
}else{
    echo "logged in"


}

标签: phpmysqlsql-injection

解决方案


不,它容易受到 SQL 注入的攻击。

使用准备好的语句,最好使用 PDO 而不是 mysqli:

$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email AND status=:status');
$stmt->execute(['email' => $email, 'status' => $status]);
$user = $stmt->fetch();

有关更多信息,请参阅这个很棒的资源https://phpdelusions.net/pdo#prepared

在此处了解 SQL 注入https://www.owasp.org/index.php/SQL_Injection


推荐阅读