什么是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 Id=@Id and pwd=@pwd";//使用占位符来占位
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注入谈数据访问层的更多相关文章

  1. 同时支持EF+Dapper的混合仓储,助你快速搭建数据访问层

    背景 17年开始,公司开始向DotNet Core转型,面对ORM工具的选型,当时围绕Dapper和EF发生了激烈的讨论.项目团队更加关注快速交付,他们主张使用EF这种能快速开发的ORM工具:而在线业 ...

  2. 数据访问层的基类BaseDALSQL

    using System; using System.Text; using System.Collections; using System.Data; using System.Data.Comm ...

  3. 数据访问层的超级基类AbstractBaseDAL

    using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...

  4. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  5. 使用JDBC构建简单的数据访问层

    本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...

  6. 使用Ninject+Moq在单元测试中抽象数据访问层

    一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑     二.步骤如下 ...

  7. 数据访问层DAL(数据库访问抽象类DataProvider)

    晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较 采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对 ...

  8. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  9. 数据访问层的改进以及测试DOM的发布

    数据访问层的改进以及测试DOM的发布 在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层 ...

随机推荐

  1. 编写高质量的Makefile

    源地址 :http://blog.csdn.net/maopig/article/details/6801749 一.前言 回想自己的第一个Makefile,是这个样子的 CODE hello:hel ...

  2. 【转】C# ABP WebApi与Swagger UI的集成

    以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用.  最近新入职,公司里 ...

  3. 关于 Visual Studio 中文提示的问题

    [转自 https://blog.csdn.net/iloli/article/details/51055299] [转自 http://www.cnblogs.com/hellowin/p/6383 ...

  4. js面向对象概念解析

    ECMAScript有两种开发模式: 1.函数式(过程化) 2.面向对象(OOP). 面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScri ...

  5. 查看md文件

    使用命令将md文件转为html,在浏览器中演示 通过npm安装i5ting_toc 安装好node之后,可以直接使用npm.Windows+R打开运行框,输入cmd,打开命令窗口.连网的情况下,输入如 ...

  6. java中不同类如何相互访问变量值(新手见解,可能很low)

    最近在学基础java知识,这个是很常见的问题之一了,下面我要列出三种异类取值方法,当然不止这些,我选择了最简单的三种: 1.可以使用static静态变量,直接调用要访问类的属性和方法.因为 Java ...

  7. js复制克隆

    $(function() {//开始加载updateIndex()}) function add(){ var str = $(".tr_wqxx").first().clone( ...

  8. Python学习——BeautifulSoup篇

    BeautifulSoup     Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beau ...

  9. Type system-Type checking

    类型系统的属性: 1.结构属性: 2.规则属性:类型系统定义了一套规则(内部数据的访问规则.函数的访问规则.类型的比较与转化规则),以供编译和运行时进行检查. In programming langu ...

  10. CorelDRAW教程:怎样绘制制作箭头流程图?

    箭头流程图主要由矢量图和连接符组成,通过图形之间的顺序阐述的一个过程,应用也是非常广泛,有些软件中会自带流程图,对于CDR这款矢量绘图软件来说,手动制作流程图是简单且高效的.首先CorelDRAW中就 ...