从SQL注入谈数据访问层

Posted wwangzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从SQL注入谈数据访问层相关的知识,希望对你有一定的参考价值。

什么是SQL注入?

SQL注入就是应用程序的开发人员未预期的吧SQL语句传入到应用程序的过程,如果直接使用用户输入的值来构建SQL语句的应用程序是很可能会受到SQL注入攻击的。特别是基于浏览器的网络应用中,SQL注入攻击比较常见。

简单来说就是使用用户输入的值来构建SQL语句比如:

技术分享
string sql="select * from UserBase where Id=‘"+txtId.text+"‘ and pwd=‘"+txtpwd.text+"";
//使用‘’“”的方式将用户输入的值包裹起来构建SQL语句
demo

这时我们只要在“txtId”这个文本框中输入“ ‘ or 1=1 -- ”这样不管他输入的账号和密码是否正确他都可以成功登陆你的应用程序,甚至还可以用这种方式自己构建SQL语句直接对你的系统级别的数据库进行操作

参数化命令

上面讲述的这种构建SQL语句的方式很容易受到SQL注入的攻击,而使用参数化命令可以有效的防止SQL注入的攻击。

如下:

技术分享

  1 string sql ="select * from UserBase where [email protected] and [email protected]";//使用占位符来占位
  2 //给占位符赋值
  3 SqlParameter sp1=new SqlParameter("@Id",txtId.Text);
  4 SqlParameter sp2=new SqlParameter("@pwd",txtpwd.Text);
  5 //将参数值与Command对象关联
  6 cmd.Parameters.Add(sp1);
  7 cmd.Parameter.Add(sp2);
参数化命令的SQL语句

上面示例中使用占位符来标示在程序运行过程中需要动态进行替换的值,通过在SQL文本参数前面加@符号实现。

ADO.Net命令对象使用一个集合保存离散的参数类型(3、4行代码),即Parameters集合。

用户可以添加任意多的参数对象并映射到SQL语句中的占位符(6、7行代码)。

SqlParameter类的常用属性

DbType 获取或设置参数的DbType
Direction 获取或设置一个值,该值指示参数是只可输入,只可输出还是双向存储过程返回值参数
IsNulllable 获取或设置一个值,该值指示参数是否接收空值
ParameterName 获取或设置SqlParameter的名称
Size 获取或设置列中数据的最大值
SqlDbType 获取或设置参数的DbType
Value 获取或设置该参数的值

用ADO.NET调用存储过程

  1. 在数据端编写存储过程

  2. 调用存储过程

    1. 为Command对象指定存储过程名称

      技术分享
        1 cmd.CommandText="Name";
      demo
    2. 指定Command对象的命令类型
      技术分享
        1 cmd.CommandType=CommandType.StoredProcedure;
      demo

  3. 存储过程返回值

         如果存储过程具有输出参数,在执行存储过程后可以通过再次访问命令对象的参数集合取得输出参数的值

以上是关于从SQL注入谈数据访问层的主要内容,如果未能解决你的问题,请参考以下文章

控制反转的实现方式

SQL注入

SQL注入原理

SQL注入

安全测试 web安全测试 常规安全漏洞 可能存在SQL和JS注入漏洞场景分析。为什么自己没有找到漏洞,哪么可能存在漏洞场景是?SQL注入漏洞修复 JS注入漏洞修复 漏洞存在场景分析和修复示例(代码片段

以下代码片段是不是容易受到 Rails 5 中 SQL 注入的影响?