Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 此sql查询能否绕过身份验证过程?_Php_Sql - Fatal编程技术网

Php 此sql查询能否绕过身份验证过程?

Php 此sql查询能否绕过身份验证过程?,php,sql,Php,Sql,我有我的网站,每天我都会查看日志文件,昨天我看到有人试图将此代码注入管理面板,下面是我面板的代码: <html> <body> <center> <form action="login.php" method="POST"> username <input type="text" name="name"> password <input type="text" name="pass"> <input value="s

我有我的网站,每天我都会查看日志文件,昨天我看到有人试图将此代码注入管理面板,下面是我面板的代码:

<html>

<body>
<center>
<form action="login.php" method="POST">
username <input type="text" name="name">
password <input type="text" name="pass">
<input value="submit" type="submit" name="go">

</form>
</center>
<?php
define('DB_SERVER', 'localhost');
   define('DB_USERNAME', 'root');
   define('DB_PASSWORD', '*****');
   define('DB_DATABASE', '******');
   $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);


$user = $_POST['name'];
$pass = $_POST['pass'];

if(isset($_POST['go']))
{
    $sql = "select * from users where username = '$user' AND password = '$pass' ";
    $result = mysqli_query($db,$sql);
      $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
      //$active = $row['active'];
      $count = mysqli_num_rows($result);

      // If result matched $myusername and $mypassword, table row must be 1 row

      if($count == 1) {


         header("location: a22.php");

      }else {
        echo $error = "<center>"."Your Login Name or Password is invalid"."</center>";
      }
   }




?>

</body>


</html>
他把密码留空了

那么这个代码能让他绕过认证过程吗?即使他/她将密码留空


注意:管理员用户有效,并且在my db中id=1

到原始问题。取决于“admin”后面是否有空格。若并没有,答案是肯定的,它可以绕过密码。您可以自己运行该脚本。 先执行SQL和as,然后继续执行或。查询看起来像

select * from users where (username = 'admin') OR ('1'='1' AND password = '$pass')
这称为SQL注入。正确的处理方法是避开所有用户输入。在这种情况下

$user = mysqli_real_escape_string($db, $_POST['name']);
$pass = mysqli_real_escape_string($db, $_POST['pass']);
这将把查询更改为

select * from users where username = 'admin\' OR \'1\'=\'1' AND password = '$pass')

您必须对每个用户输入执行转义。永远不要相信用户

到原始问题。取决于“admin”后面是否有空格。若并没有,答案是肯定的,它可以绕过密码。您可以自己运行该脚本。 先执行SQL和as,然后继续执行或。查询看起来像

select * from users where (username = 'admin') OR ('1'='1' AND password = '$pass')
这称为SQL注入。正确的处理方法是避开所有用户输入。在这种情况下

$user = mysqli_real_escape_string($db, $_POST['name']);
$pass = mysqli_real_escape_string($db, $_POST['pass']);
这将把查询更改为

select * from users where username = 'admin\' OR \'1\'=\'1' AND password = '$pass')

您必须对每个用户输入执行转义。永远不要相信用户

使用准备好的语句和参数化查询

查询没有转义输入,因此所有内容都与您插入的内容完全相同

查询的结果是
select*从用户名='admin'或'1'='1'和密码='$pass'的用户中选择

如果添加
--
,则将不再执行“---”之后的结果。
您可以100%确定有人绕过了您的身份验证。

使用准备好的语句和参数化查询

查询没有转义输入,因此所有内容都与您插入的内容完全相同

查询的结果是
select*从用户名='admin'或'1'='1'和密码='$pass'的用户中选择

如果添加
--
,则将不再执行“---”之后的结果。

您可以100%确定有人绕过了您的身份验证。

您应该使用它来防止SQL注入。还要清理输入以防止XSS攻击等。

您应该使用它来防止SQL注入。同时清理输入以防止XSS攻击等。

查看在这种情况下实际生成的查询(echo$sql;),并对其进行分析。你怎么看?我不使用任何api,只使用mysql数据库。@misorude我不懂你的意思?他能绕过授权吗?如果他写了这个密码?你的密码里绝对没有逃逸或其他保护措施!这将允许大量恶意查询。最好使用查询生成器,或者至少使用mysqli\u real\u escape\u string($user)…您还应该散列您的密码!!将它们存储在文本中根本不安全。实际上,使用纯文本密码是一个非常糟糕的主意-您应该对密码进行哈希运算。查看实际生成的查询(echo$sql;),并对其进行分析。你怎么看?我不使用任何api,只使用mysql数据库。@misorude我不懂你的意思?他能绕过授权吗?如果他写了这个密码?你的密码里绝对没有逃逸或其他保护措施!这将允许大量恶意查询。最好使用查询生成器,或者至少使用mysqli\u real\u escape\u string($user)…您还应该散列您的密码!!将它们存储在文本中根本不安全。实际上,使用纯文本密码是一个非常糟糕的主意-你应该散列密码。“mysqli\u real\u escape\u string”对于sql注入攻击是不安全的。你应该使用预先准备好的语句。此外,你的示例查询完全不正确。不(在他的代码中。因此您的示例无法运行。您必须防止检查密码。这只能通过在用户名后添加--来完成。查看我的答案以获得正确的查询输出。您不必这样做,并且作为第一个执行,因此其位置为(true)或(false)。您可以尝试在本地计算机上运行类似的查询。从id_column='some_key'或1=1和some_column='nonsence_value'@DimitrisFilippou的任意_表中选择*。我没有看到任何SQL注入绕过mysqli_real_escape_字符串的示例。快速谷歌没有帮助。您可以与我们共享任何资源吗?有可能绕过这些限制cape,如果应用程序的字符集未正确定义。最好的解决方案始终是准备和绑定数据,而不是注入数据,即使数据已转义。这不仅简单,而且不会损坏数据。如果在对密码进行散列之前转义密码,则散列将发生更改,例如,“mysqli_real_escape_string”对于sql注入攻击。您应该使用准备好的语句。此外,您的示例查询完全不正确。否(在他的代码中。因此,您的示例无法运行。您必须阻止检查密码。这只能通过在用户名后添加--来完成。查看我的答案以获得正确的查询输出。您不必自那时起作为第一个执行,因此其位置为(true)或(false)。您可以尝试在本地计算机上运行类似的查询。从id_column='some_key'或1=1和some_column='nonsence_value'@DimitrisFilippou的任意_表中选择*。我没有看到任何SQL注入绕过mysqli_real_escape_字符串的示例。快速谷歌没有帮助。您可以与我们共享任何资源吗?有可能绕过这些限制cape,如果应用程序的字符集未正确定义。最好的解决方案始终是准备和绑定数据,而不是注入数据,即使数据已转义。这不仅简单,而且不会损坏数据。例如,如果在对密码进行散列之前转义密码,则散列将发生更改。这最多只是一条注释,而不是答案。Th这充其量只是一个评论,而不是一个答案。