什么是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. 剑指offer——03从尾至头打印列表(Python3)

    思路:相当于数据结构中的链表就地逆置,可以使用头插法来实现. 代码: class Solution:     # 返回从尾部到头部的列表值序列,例如[1,2,3]     def printListF ...

  2. iOS开发 小知识点

    1/ iOS汉字百分号互相转换. //汉字 NSString * name = @"时间终于将我对你的爱消耗殆尽"; //汉字转为百分比 NSString * encodeStri ...

  3. SQL Server-聚焦聚集索引对非聚集索引的影响

      前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没 ...

  4. 【摘录】JAVA内存管理-自动选择垃圾收集器算法

    在J2SE 5.0,垃圾收集的默认值:垃圾收集器.堆大小以及JVM的类型(客户端还是服务器)都会根据应用运行的硬件平台和操作系统自动选择.相比之前设置命令行参数的方式,自动选择很好的匹配了不同类型的应 ...

  5. php基础-------preg_replace()与preg_replace_callback()

    1.preg_replace() 执行一个正则表达式的搜索和替换. 语法: mixed preg_replace ( mixed $pattern , mixed $replacement , mix ...

  6. HDU1231 最长连续子序列

    最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  7. [HDU1160]FatMouse's Speed

    题目大意:读入一些数(每行读入$w[i],s[i]$为一组数),要求找到一个最长的序列,使得符合$w[m[1]] < w[m[2]] < ... < w[m[n]]$且$s[m[1] ...

  8. multiple definition of

    总结了解决multiple definition of的方法: 问题原因:    当多个文件包含同一个头文件时,并且你的.H里面没有加上条件编译#ifndef TEST_H#define TEST_H ...

  9. How to check Open vSwitch version and supports OpenFlow version

    Open vSwitch (OVS) is an open-source virtual switch, featuring programmable switch forwarding capabi ...

  10. 【Codeforces Round #482 (Div. 2) C】Kuro and Walking Route

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把x..y这条路径上的点标记一下. 然后从x开始dfs,要求不能走到那些标记过的点上.记录节点个数为cnt1(包括x) 然后从y开始 ...