【澳门金沙vip】SQL 注入原理及防范1

–常用的方式 复制代码 代码如下:insert
into jobs(job_desc,min_lvl,max_lvl) values(‘SQL语句插入数据A’,45,54)
insert into jobs(job_desc,min_lvl,max_lvl)
values(‘SQL语句插入数据B’,45,54) insert into
jobs(job_desc,min_lvl,max_lvl) values(‘SQL语句插入数据C’,45,54)
–比较简单的方式 复制代码
代码如下:insert into jobs(job_desc,min_lvl,max_lvl) select
‘SQL语句插入数据A’,45,54 union all select ‘SQL语句插入数据B’,45,54 union
all select ‘SQL语句插入数据C’,45,54

原文地址:

SQL事务的好处,不在多说,重点说下C#下 执行SQL事务

SQL
Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

 

具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

C# 执行SQL事务 又两种方法(本人总结的)

首先让我们了解什么时候可能发生SQL Injection。

1.通过存储过程。

假设我们在浏览器中输入URLwww.sample.com,由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL
Injection,当我们输入www.sample.com?testid=23时,我们在URL中传递变量testid,并且提供值为23,由于它是对数据库进行动态查询的请求(其中?testid=23表示数据库查询变量),所以我们可以该URL中嵌入恶意SQL语句。

2.通过C#中提供的 Transaction 。

现在我们知道SQL Injection适用场合,接下来我们将通过具体的例子来说明SQL
Injection的应用,这里我们以pubs数据库作为例子。

下面分别说明:

我们通过Web页面查询job表中的招聘信息,job表的设计如下:

1.通过存储过程。即是把SQL事务的COMMIT TRANSACTION 、ROLLBACK
TRAN、写在存储过程中,通过C# 执行存储过程,来执行。如果采用MVC
建议采用此方法。下面给出存储过程中写的事务实例。

–SQL事务处理实例:  
  
SET QUOTED_IDENTIFIER ON   
GO  
SET ANSI_NULLS ON   
GO  
  
CREATE PROCEDURE Apparatus_GetModel  
  
@job_desc varchar(50),  
@min_lvl tinyint,  
@max_lvl tinyint,  
@id int,  
@name varchar(40)  

图1 jobs表

as
    
begin tran  
  
–第一张表的插入语句   
INSERT INTO dbo.jobs (job_desc, min_lvl,max_lvl)     
VALUES(@job_desc,@min_lvl,@max_lvl)    
  
–第二张表的插入语句    
INSERT INTO test (id,name) values( @id,@name)  
    
–如果有一张表插入失败就回滚  
IF @@ERROR <> 0    
      BEGIN   
       ROLLBACK TRAN     
         
       RETURN 0  
      END   
    
else    
      BEGIN   
       COMMIT TRANSACTION
       RETURN 1  
     END
         
GO  
SET QUOTED_IDENTIFIER OFF   
GO  
SET ANSI_NULLS ON   
GO

接着让我们实现Web程序,它根据工作Id(job_id)来查询相应的招聘信息,示意代码如下:

执行存储过程的代码,DbHelperSQL.cs中有。

///

 

///Handles the Load event of the Page control.///

2.通过C#中提供的 Transaction 。就是通过C#来控制事务的回滚等。

/// The source of the event.

上篇文章已经给出咯简单的例子。

/// Theinstance containing the event data.protected
voidPage_Load(objectsender,EventArgse){if(!IsPostBack)    {// Gets
departmentId from http request.stringqueryString =
Request.QueryString[“departmentID”];if(!string.IsNullOrEmpty(queryString)) 
      {// Gets data from database.gdvData.DataSource =
GetData(queryString.Trim());// Binds data to
gridview.gdvData.DataBind();        }    }}

在DbHelperSQL.cs中也提供的有执行多条SQL语句的事务处理方法。如:

        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param
name=”SQLStringList”>SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
        public static void ExecuteSqlTran(Hashtable SQLStringList)
        {
            using (SqlConnection conn = new
SqlConnection(connectionString))
            {
                conn.Open();
                using (SqlTransaction trans = conn.BeginTransaction())
                {
                    SqlCommand cmd = new SqlCommand();
                    try
                    {
                        //循环
                        foreach (DictionaryEntry myDE in
SQLStringList)
                        {
                            string cmdText = myDE.Key.ToString();
                            SqlParameter[] cmdParms =
(SqlParameter[])myDE.Value;
                            PrepareCommand(cmd, conn, trans, cmdText,
cmdParms);
                            int val = cmd.ExecuteNonQuery();
                            cmd.Parameters.Clear();

现在我们已经完成了Web程序,接下来让我们查询相应招聘信息吧。

                            trans.Commit();
                        }
                    }
                    catch
                    {
                        trans.Rollback();
                        throw;
                    }
                }
            }
        }

图2 job表查询结果

如图所示,我们要查询数据库中工作Id值为1的工作信息,而且在页面显示了该工作的Id,Description,Min
Lvl和Max Lvl等信息。

现在要求我们实现根据工作Id查询相应工作信息的功能,想必大家很快可以给出解决方案,SQL示意代码如下:

SELECTjob_id,job_desc,min_lvl,max_lvlFROMjobsWHERE(job_id=1)

假设现在要求我们获取Department表中的所有数据,而且必须保留WHERE语句,那我们只要确保WHERE恒真就OK了,SQL示意代码如下:

SELECT    job_id, job_desc, min_lvl, max_lvlFROM        jobs

WHERE(job_id = 1) OR 1 = 1

上面我们使得WHERE恒真,所以该查询中WHERE已经不起作用了,其查询结果等同于以下SQL语句。

SELECT    job_id, job_desc, min_lvl, max_lvlFROM        jobs

SQL查询代码实现如下:

stringsql1 =string.Format(“SELECT job_id, job_desc, min_lvl, max_lvl
FROM jobs WHERE job_id='{0}'”, jobId);

现在我们要通过页面请求的方式,让数据库执行我们的SQL语句,我们要在URL中嵌入恶意表达式1=1(或2=2等等),如下URL所示:

http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1’or’1’=’1

等效SQL语句如下:

SELECTjob_id,job_desc,min_lvl,max_lvlFROMjobsWHEREjob_id=’1’OR’1’=1′

图3 job表查询结果

现在我们把job表中的所有数据都查询出来了,仅仅通过一个简单的恒真表达式就可以进行了一次简单的攻击。

虽然我们把job表的数据都查询出来了,但数据并没有太大的价值,由于我们把该表临时命名为job表,所以接着我们要找出该表真正表名。

首先我们假设表名就是job,然后输入以下URL:

http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1’or 1=(select
count(*) from
job)–%20from%20job)–)

等效SQL语句如下:

SELECTjob_id,job_desc,min_lvl,max_lvlFROMjobsWHEREjob_id=’1’or1=(selectcount(*)fromjob)–‘

图4 job表查询结果

当我们输入了以上URL后,结果服务器返回我们错误信息,这证明了我们的假设是错误的,那我们该感觉到挫败吗?不,其实这里返回了很多信息,首先它证明了该表名不是job,而且它还告诉我们后台数据库是SQL
Server,不是MySQL或Oracle,这也设计一个漏洞把错误信息直接返回给了用户。

接下假定表名是jobs,然后输入以下URL:

http://localhost:3452/ExcelUsingXSLT/Default.aspx?jobid=1’or1=(select
count(*) from jobs)
–%20from%20jobs)%20–)