≡菜单

如何防止SQL注入攻击(以示例说明)

本文通过一个显示SQL Injection的示例解释了SQL Injection的基础,并提供了防止这些攻击的方法。

顾名思义,这种攻击可以通过SQL查询来完成。许多Web开发人员都不知道攻击者如何篡改SQL查询。 SQL注入可以在没有’t正确过滤用户输入并信任用户提供的任何内容。 SQL注入的想法是使应用程序运行不需要的SQL查询。

本文中提到的所有示例均通过以下测试:

  • PHP 5.3.3-7
  • 阿帕奇/2.2.16
  • PostgreSQL 8.4

SQL注入示例

大多数Web应用程序都有一个登录页面。因此,我们将从此开始。让我们假设以下代码是由应用程序编写的。

index.html:

<html>
<head><title>SQL Injection Demo</title></head>
 <body  上 load="document.getElementById('user_name').focus();" >
 <form name="login_form" id="login_form" method="post" action="login.php">
  <table border=0 align="center" >
   <tr>
    <td colspan=5 align="center" ><font face="Century Schoolbook L" > Login Page </font></td>
   </tr>
   <tr>
    <td> User  名称 :</td><td> <input type="text" size="13" id="user_name" name="user_name" value=""></td>
   </tr>
   <tr>
    <td> Password: </td><td> <input type="password" size="13" id="pass_word" name="pass_word" value=""></td>
   </tr>
   <tr>
    <td colspan=2 align="center"><input type="submit" value="Login"> </div></td>
   </tr>
  </table>
 </form>
</body>
</html>

当用户输入user_name和pass_word时,它将通过HTTP_POST方法发布到login.php。

login.php:

<?php
$Host= '192.168.1.8';
$Dbname= 'john';
$User= 'john';
$Password= 'xxx';
$Schema = 'test'; 

$Conection_string="host=$Host dbname=$Dbname user=$User password=$Password"; 

/* Connect with database asking for a new connection*/
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW); 

/* Error checking the connection string */
if (!$Connect) {
 echo "Database Connection Failure";
 exit;
} 

$query="SELECT * from $Schema.users where user_name='".$_POST['user_name']."' and password='".$_POST['pass_word']."';"; 

$result=pg_query($Connect,$query);
$rows = pg_num_rows($result);
if ($rows) {
 echo "Login Success";
}
else {
 echo "Login Failed";
}
?>

上面代码中的行号19很容易受到SQL-Injection(即以“$query=”SELECT *..”)。 SQL查询被设计为将给定的用户名和密码与数据库匹配。如果用户提供有效的用户名和密码,它将正常工作。但是,攻击者可以按以下方式设计输入:

在用户名字段中,代替提供用户名,攻击者可以输入以下内容。

' or 1=1;--

然后,攻击者将密码字段留空。

当攻击者单击提交时,详细信息将发布到login.php。在login.php中,查询的框架如下:

SELECT * from test.members where user_name='' or 1=1;--' and password='';

上面的是一个有效的SQL查询。在postgresql中-是注释字符。因此–之后的语句将被视为注释,并且不会执行。现在postgresql将执行

select * from test.members where user_name='' or 1=1;

这将返回true并给出“登录成功”消息。

如果攻击者知道数据库表的名称,那么他甚至可以通过在用户名字段中输入以下内容来删除这些表。

';drop table test.lop;--

一些登录应用程序,往往会执行以下操作。

  • 将密码存储为md5
  • 首先根据提供的用户名从数据库中选择用户名,密码。
  • 然后md5用户提供的密码,并将其与从数据库获取的密码进行比较。
  • 如果两者都匹配,则登录成功。

让’s看到如果查询容易受到SQL-Injection的攻击,我们如何绕过它。

login.php:

$ query ="SELECT user_name,password from $Schema.members where user_name='".$_POST['user_name']."';"; 

$result=pg_query($Connect,$query); 

$row=pg_fetch_array($result,NULL,PGSQL_ASSOC); 

# Find the md5 for the user supplied password.
$user_pass = md5($_POST['pass_word']); 

if(strcmp($user_pass,$row['password'])!=0) {
 echo "Login Failed\n";
}
else {
 echo "Login Success\n";
}

现在在用户名字段中输入以下内容

' UNION ALL SELECT 'laksh','202cb962ac59075b964b07152d234b70

Enter “123” in the password field and click submit. md5(123) is202cb962ac59075b964b07152d234b70

现在查询将扩展如下:

SELECT user_name,password from test.members where user_name='' UNION ALL SELECT 'laksh','202cb962ac59075b964b07152d234b70';

执行以上查询后,数据库将返回‘laksh’作为用户名和‘202cb962ac59075b964b07152d234b70’ as password.

我们还在pass_word字段中张贴了“ 123”。因此,strcmp将返回0,并且身份验证将成功。

以上只是SQL注入攻击的几个示例。这些变化很多。以下是可以减少SQL注入攻击可能性的一些措施。

  • Strict type checking ( 唐’不信任用户输入的内容)
  • 如果希望输入用户名,请验证它是否仅包含字母数字。
  • 转义或过滤特殊字符和用户输入。
  • 使用准备好的语句执行查询。
  • 唐’t允许在单个语句上执行多个查询。
  • 唐’通过显示“语法错误”等将数据库信息泄漏给最终用户。

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书 Vim 101黑客手册

{ 7 评论 … 加一 }

  • Vineel Kumar Reddy Kovvuri 2012年2月7日,上午1:55

    好文章
    但是它主要是关于sql注入技术而不是预防。
    感谢您分享您的想法…..

  • 罗恩 2012年2月7日,上午9:05

    谢谢
    好文章。
    所有开发人员都应对此进行记录;初级和高级。

  • 塔伦 2012年2月9日,上午1:00

    很棒的文章-

  • 加内什 2012年3月1日,上午2:18

    谢谢

  • 拉贾塞卡 2012年3月9日,上午3:15

    非常有用,但是请让我知道这适用于所有数据库或仅适用于postgresql

  • 高塔玛玛·索尼 2012年9月24日,下午1:25

    您好亲爱的,您撰写有关易受攻击的网站的文章…任何身体都容易攻击。您的想法很好,但只存在于攻击中。您的概念与针对SQL INJECTION的安全性无关。亲爱的,您考虑预防sql注入…

  • 钱达纳·尼拉甘蒂 2014年6月11日,下午1:08

    嗨,弗朗德,伊茨非常高兴知道这次袭击…以及它的可能性。但是,我们需要如何预防它们。我们如何轻松找到克服攻击的方法。

发表评论