SQL注入身份验证绕过问题

时间:2019-05-05 13:42:57

标签: php mysql sql code-injection

我会简短地讲清楚这一点。

我正在下面编写的PHP代码上测试SQLI登录绕过。

if(isset($_POST["login"]) && isset($_POST["password"])){


$sql="select * from users where login='{$_POST["login"]}' and password='{$_POST["password"]}'";


$result=mysqli_query($conn, $sql);


if(mysqli_num_rows($result) != 0)
    echo "<h1>Login Success!</h1>";


else
    echo "<h1>Invalid Login!</h1>";


} 

我使用 admin'-作为登录字段,以便成功绕过登录而无需输入密码。

但是问题是它不起作用,但是当我尝试使用此 admin'-'-时,它起作用了。

所以问题是,该特殊备忘单如何工作,为什么会起作用,而不是第一个呢?

admin'-'-有效,但此 admin'-

不起作用

当我输入这两个备忘单时,这些是服务器端代码。

无效的旁路。

$sql="select * from users where login='admin' --' and password='{$_POST["password"]}'"; 

有效的旁路。

$sql="select * from users where login='admin' -- ' --' and password='{$_POST["password"]}'"; 

只需要对第一个备忘单如何以及为何不起作用而第二个备忘单起作用的原因进行澄清或解释。谢谢!

1 个答案:

答案 0 :(得分:-1)

您的代码中存在一些实际的语法错误:

首先:请勿执行以下操作:$sql="select * from users where login='{$_POST["login"]}' and password='{$_POST["password"]}'";

正确的方法是创建一个变量,该变量等于login和password的值。示例:

$login=$_POST['login'];
$password=$_POST['password'];

此后,您的查询应如下所示:

$sql="select * from users where login='$login' and password='$password'";