`

SQL注入问题总结

 
阅读更多

一、SQL注入介绍

 

SQL注入就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样;

方法:在表单中将命令当作用户输入提交给程序;

 

二、SQL注入范例

 

这里我们根据用户登录页面

 

[html] view plaincopy
 
  1. <form action="" >  
  2. 用户名:<input type="text" name="username"><br/>  
  3. 密  码:<input type="password" name="password"><br/>  
  4.  </form>  

 

 

预先创建一个表:

 

[java] view plaincopy
 
  1. create table user_table(  
  2.     id      int Primary key,  
  3.     username    varchar(30),  
  4.     password    varchar(30)  
  5. );  
[java] view plaincopy
 
  1. insert into user_table values(1,'xiazdong-1','12345');  
  2. insert into user_table values(2,'xiazdong-2','12345');  

 

一般查询数据库的代码如下:

[java] view plaincopy
 
  1. public class Demo01 {  
  2.     public static void main(String[] args) throws Exception {  
  3.         String username = "xiazdong";  
  4.         String password = "12345";    
  5.         String sql = "SELECT id FROM user_table WHERE " + "username='" + username  
  6.                 + "'AND " + "password='" + password + "'";  
  7.         Class.forName("com.mysql.jdbc.Driver");  
  8.         Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1","root","12345");  
  9.         PreparedStatement stat = con.prepareStatement(sql);  
  10.         System.out.println(stat.toString());  
  11.         ResultSet rs = stat.executeQuery();  
  12.         while(rs.next()){  
  13.             System.out.println(rs.getString(1));  
  14.         }  
  15.     }  
  16. }  

 

但是这里username=xiazdong,password=12345,

因此此处的SQL语句为:

 

[java] view plaincopy
 
  1. SELECT id FROM user_table WHERE username='xiazdong' AND password='12345';  

 

如果我们把username和password的值变为:

username='  OR 1=1 -- 
password=x

会变成一个很可怕的情况:将把数据库中所有用户都列出来,为什么呢?

因为SQL语句现在为:

 

[java] view plaincopy
 
  1. SELECT id FROM user_table WHERE username='' OR 1=1 -- ' AND password='12345';  

 

因为--表示SQL注释,因此后面语句忽略;

因为1=1恒成立,因此 username='' OR 1=1  恒成立,因此SQL语句等同于:

 

[java] view plaincopy
 
  1. SELECT id FROM user_table;  

 

很奇妙吧....

 

三、解决方法

 

其实解决方法很简单,就是使用PreparedStatement即可;

 

 

1.限制错误信息的输出

  这个方法不能阻止SQL注入,但是会加大SQL注入的难度,不会让注入者轻易得到一些信息,让他们任意破坏数据库。SQL Server有一些系统变量,如果我们没有限制错误信息的输出,那么注入着可以直接从出错信息获取,例如(假定这里用的string即字符类型并可以发生SQL注入):http://www.xxx.com/showdetail.aspx?id=49 and user>0 这句语句很简单,但却包含了SQL Server特有注入方法的精髓,。首先看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQL Server的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQL Server的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,注入着就拿到了数据库的用户名。

  众所周知,SQL Server的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。

  当然注入者还可以输入不同的信息来得到他们想要的信息 ,上面只是其中一个例子,所以我们要限制错误信息的输出,从而保护我们的数据库数据,这里我给出.NET限制错误信息的方法:

  在Web.Config文件中设置

  <customErrors mode="On" defaultRedirect="error.aspx">

  </customErrors>

  这样当发生错误时候就不会讲信息泄露给外人。

2.限制访问数据库帐号的权限

  对于数据库的任何操作都是以某种特定身份和相应权限来完成的,SQL语句执行前,在数据库服务器端都有一个用户权限验证的过程,只有具备相应权限的帐号才可能执行相应权限内的SQL语句。因此,限制数据库帐号权限,实际上就阻断了某些SQL语句执行的可能。不过,这种方法并不能根本解决SQL注入问题,因为连接数据库的帐号几乎总是比其他单个用户帐号拥有更多的权限。通过限制贴帐号权限,可以防止删除表的攻击,但不能阻止攻击者偷看别人的信息。

3.参数化使用命令

  参数化命令是在SQL文本中使用占位符的命令。占位符表示需要动态替换的数据,它们通过Command对象Parameters集合来传送。能导致攻击的SQL代码可以写成:

Select * from employee where userID=@userID;

  如果用户输入: 09105022’OR ‘1’=’1,将得不到何记录,因为没有一个用户ID与文本框中输入的’ 09105022’OR ‘1’=’1’相等。参数化命令的语法随提供程序的不同略有差异。对于SQL SERVER提供程序,参数化命令使用命名的占位符(具有唯一的名字),而对于OLE DB提供程序,每个硬编码的值被问号代替。使用OLE DB提供程序时,需要保证参数的顺序和它们出现在SQL字符串中的位置一致。SQL SERVER提供程序没有这样的需求,因为它们用名字和占位符匹配。

4.调用存储过程

  存储过程是存储在数据库服务器上的一系列SQL代码,存储过程与函数相似,有良好的逻辑封装结构,可以接收和返回数据。使用存储过程可以使代码更易于维护,因为对存储过程的更改不会导致应用程序的重新编译,使用存储过程还可以节省带宽,提高应用程序性能。因为存储过程是存储在数据库服务端的独立的封装体,调用存储过程可以保证应用程序只执行存储过程中的固定代码,从而杜绝SQL语句注入的可能。结合上述所讲的参数化命令,可以实现SQL代码可以实现的任何功能,并进一步提高应用程序的安全等级。

 

5.如果加密了,一旦被MD5加密或者其他加密方式加密的,那么密码就不会是完整的,那么就不存在这样的错误了。

             如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
  statement := "SELECT * FROM user_info WHERE userid = " & id_text & ";"
        从这个语句可以看出,id_text是一个与“userid”字段有关的数字。不过,如果终端用户选择一个字符串,就绕过了对转义字符的需要。例如,将id_text设置为:1;DROP TABLE users,它会将“users”表从数据库中删除,SQL语句变成:SELECT * FROM User_Info WHERE UserID= 1;DROP TABLE users;好滴,那么你的数据库就会遭受不可恢复的删除。
 
 
from:http://blog.csdn.net/xiazdong/article/details/7368576
分享到:
评论

相关推荐

    如何解决sql注入问题

    总结而言,解决SQL注入问题需要开发者、数据库管理员和安全专家的共同努力。通过采用安全编码实践、强化输入验证、合理使用数据库功能以及持续监控和更新安全策略,可以显著降低应用程序遭受SQL注入攻击的风险。

    SQL注入攻击实验报告

    ### SQL注入攻击实验报告知识点详解 #### 一、实验背景及目的 - **实验背景**:随着互联网技术的发展,Web应用程序越来越广泛地...在实际开发过程中,必须高度重视安全性问题,采取多种措施来预防和抵御SQL注入攻击。

    sql注入讲解ppt.pptx

    SQL 注入基础知识点总结 SQL 注入是指 web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法...

    SQL注入漏洞全接触.ppt

    "SQL注入漏洞全接触"知识点总结 一、 SQL注入漏洞的定义和原理 * SQL注入漏洞是指攻击者通过构造特殊的输入,来获取或修改服务器上的敏感数据。 * SQL注入漏洞的原理是从客户端提交特殊的代码,从而收集程序及...

    mybatis如何防止SQL注入

    这种方式虽然灵活,但容易导致SQL注入问题。例如: ```xml SELECT id, title, author, content FROM blog ORDER BY ${orderParam} ``` 如果`orderParam`的值没有经过恰当的处理,直接使用`ORDER BY ${...

    DVWA之SQL注入详解(包含知识点)

    SQL注入是网络安全领域中的一种常见的攻击手段,它允许攻击者通过在应用程序的输入参数中插入恶意的SQL代码片段,从而在数据库服务器上执行未授权的查询或操作。这种攻击方法对数据库安全构成了极大的威胁,因此了解...

    JavaScript过滤SQL注入字符

    JavaScript过滤SQL注入字符 ...总结,JavaScript在防止SQL注入中扮演了辅助角色,前端过滤可以提高安全性,但必须结合后端验证才能构建坚固的防线。开发者应了解并实施最佳实践,确保应用的安全性。

    SQL注入攻击与防御

    针对SQL注入隐蔽性极强的特点,《SQL注入攻击与防御》重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,《SQL注入攻击与防御》还专门从代码层和系统层的角度介绍了避免SQL注入的...

    《SQL注入攻击与防御 第2版》PDF版本下载.txt

    ### SQL注入攻击与防御知识点详解 #### 一、SQL注入概述 SQL注入是一种常见的Web应用程序安全漏洞,攻击...希望这些信息能够帮助您更好地理解SQL注入这一安全问题,并采取有效措施保护您的Web应用程序免受此类攻击。

    使用Python防止SQL注入攻击的实现示例

    ### 使用Python防止SQL注入攻击的实现示例 #### 文章背景与重要性 随着网络技术的发展,Web应用程序的安全性越来越受到人们的重视。开放式Web应用程序安全项目(OWASP)每几年都会发布一次关于Web应用程序最常见...

    sql注入攻击防范解析

    SQL注入攻击是网络安全领域中一个严重的问题,它发生在应用程序未能充分验证或清理用户输入的数据时。当恶意用户通过输入特定的SQL代码,使得数据库执行非预期的操作,就可能发生SQL注入。这种攻击可能导致数据泄露...

    sql注入攻击常用语句总结

    sql注入总结 语句精简 类型丰富 种类齐全 值得学习 欢迎借鉴

    sql注入绕过方法总结

    sql注入绕过方法总结,绕过waf,D盾

    SQL注入之如何检测与判断详细过程

    ### SQL注入检测与判断详细过程 #### 一、SQL注入简介 SQL注入是一种常见的Web应用程序安全漏洞,攻击者可以通过向数据库提交恶意SQL代码来获取敏感数据、修改数据或执行其他非法操作。随着网络安全意识的提高和...

    SQL注入简单总结——过滤逗号注入.pdf

    总结,SQL注入是数据库安全的重要问题,特别是对于逗号过滤的场景,需要开发者采取额外的防范措施。通过理解和应用上述的绕过技巧,可以更好地进行安全测试和防御。同时,不断学习和更新安全知识,以应对不断演化的...

    SQL注入手工检测sql注入检测

    ### SQL注入手工检测详解 #### 一、SQL注入概述 SQL注入是一种常见的Web应用程序安全漏洞,攻击者通过向Web应用程序提交恶意SQL语句,利用这些语句与后端数据库进行交互,进而获取敏感数据或执行非法操作。手工...

    sql注入关键字大全

    ### SQL注入关键字详解 #### 一、SQL注入基础概念 SQL注入是一种常见的安全攻击手段,攻击者通过在输入数据中嵌入恶意SQL代码,利用应用程序对用户输入验证不足的漏洞,实现非法操作数据库的目的。本篇文章将围绕...

    防止sql注入demo

    - 使用ORM框架:如Hibernate、MyBatis等,它们在底层处理了SQL注入问题,减少了直接编写SQL语句的机会。 - 输入验证:对用户输入进行校验,限制长度、类型和格式,拒绝不符合规则的输入。 - 使用过滤器(Filter)...

Global site tag (gtag.js) - Google Analytics