博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ADO.NET笔记——SQL注入攻击
阅读量:6578 次
发布时间:2019-06-24

本文共 2568 字,大约阅读时间需要 8 分钟。

相关知识:

  1. 可以通过字符串的拼接来构造一个SQL命令字符串,但是SQL命令字符串的拼接确是造成“SQL注入攻击”的重要原因。
  2. 考虑下列例子:从ProductCategory表中检索出Name为“Bikes”的类别信息。(示例数据库采用红皮书的数据库:AdventureWorks_WroxSSRS2012)
    • 如果要凭借字符串,将写成:
      string name = "Bikes";    string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";

      请注意:单引号是字符串的起止标记。

    • 但是,如果name变量不是由程序硬编码,而是由用户输入(比如,从页面输入框),那么就有可能有“非法”输入。例如:
      string name  = "Bikes'; DELETE FROM Production.ProductCategory;'";    string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";

      请注意:在Bikes之后添加了一个单引号,以便与"… Name='" + name + "'"构成一个语句合法的SQL语句,成为下面的样子而被执行:

      "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='Bikes'; DELETE FROM Production.ProductCategory;";

      在这种情况下,strCmd将首先执行SELECT语句,然后执行DELETE语句。

    • 这种情况极其危险。其根源在于单引号作为字符串的起止标记,用户非法输入的字符串被程序的SQL字符串拼接后,对数据库造成了严重威胁。这被称为SQL注入攻击。
  3. 因为注入攻击是由于单引号引起的,所以,很自然的一种缓解的办法就是,不要让单引号解释成为“字符串的起止符”,而是仅仅作为单引号符号。
    •  在SQL中,如果要表示一个单引号符号,需要使用:''。(这不是一个双引,而是两个单引连这写。)
    • 因此,如果把命令字符串中的所有单引号都替换成为两个单引号,就能有效减少SQL注入攻击: 
      string strCmd = "SELECT ProductCategoryID, Name FROM Production.ProductCategory WHERE Name='" + name + "'";    string strCmdEncoded = strCmd.Replace("'", "''");

       

代码示例:

1             static void Main(string[] args) 2             { 3                 string userName = "xxx"; 4                 string password = "xxx' OR '1'='1";     //构造一个可能产生SQL注入攻击的字符串 5                 string strCmd = "SELECT AccountID FROM Account WHERE AccountName='" + userName + 6                     "' AND Password='" + password + "'";  7                 //下面的语句把单引号替换为两个单引号,从而使之不再代表字符串的起止,进而消除了SQL注入攻击  8                 //strCmd = strCmd.Replace("'", "''"); 9     10                 string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pws=root";11                 SqlConnection conn = new SqlConnection(strConn);12                 conn.Open();13                 SqlCommand cmd = new SqlCommand(strCmd, conn);14                 SqlDataReader dr = cmd.ExecuteReader();15                 if (dr.Read())16                 {17                     Console.WriteLine("登录成功!");18                 }19                 else20                 {21                     Console.WriteLine("用户名或密码错误!");22                 }23                 conn.Close();24             }25

 

程序分析:

  1. 程序本意是:如果userName和password在数据中匹配存在,那就返回该用户对应的AccountID,表示登陆成功;如果不匹配,那就表示失败。
  2. 但是经过设计一个SQL注入攻击的字符串(见示例代码),无论输入怎么样的用户名和密码,最终都会登陆成功。
  3. 取消strCmd = strCmd.Replace("'", "''");的注释,再次运行程序,将抛出一个SQL异常,这就表明SQL语句被认为不符合语法要求,SQL注入攻击失败。

 

转载于:https://www.cnblogs.com/chenguangqiao/p/4353718.html

你可能感兴趣的文章
第4次作业类测试代码+105032014065+方绎杰
查看>>
Python绘制KS曲线
查看>>
DbUtils类的添加,修改,删除
查看>>
前端渲染和后端渲染
查看>>
项目代码matlab
查看>>
Reboot运维开发Python-03
查看>>
Javascript中括号“[]”的多义性
查看>>
.NET中异常类(Exception)
查看>>
Python windows serial
查看>>
吃货联盟
查看>>
redis的操作
查看>>
SDL1.3(C语言)程序移植LINUX。。。
查看>>
活动选择问题 贪心
查看>>
我的第一篇博客
查看>>
页面前端的水有多深?再议页面开发
查看>>
我的firefox插件开发历程
查看>>
我很高兴找了一张可以说明:为什么软件开发那么困难的图
查看>>
iOS:翻页效果
查看>>
(原创)Python文件与文件系统系列(5)——stat模块
查看>>
【ABAP】Cross client master/business data transfer guide(ALE &I Doc)
查看>>