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这充其量只是一个评论,而不是一个答案。