版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/wangyy130/article/details/26154837

      要说SQL注入还要从看.NET视频開始说起,听说在程序开发过程中。我们经常会遇到SQL注入问题。也就是指令隐码攻击。详细的原理究竟是怎么回事儿。查了些资料好像涉及到了编译原理,也没能够看明确,仅仅是视频中讲到了这三种方法是经经常使用来避免SQL注入最经常使用的方法,于是查些资料希望能对现学的知识有一定的了解。

以下是对这三种方法详细怎样使用的一个简单的介绍。

一、存储程序

         在学习数据库视频的时候接触过。它是存储在数据库中的一些事先编译好的指令。在用的时候不用又一次编写,直接调用就好了。所以,使用它能够大大提高程序的运行效率。

那么,怎样创建一个存储程序并使用它呢?这是我们今天要解决的问题。

         1.创建过程

            可编程性——下拉菜单——存储过程——右键——查询菜单———指定模板參数的值——新建查询——输入语句——查询菜单中的分析检查语法是否正确——运行

        2.详细创建语法

在创建存储程序时,为了应对各种变换的数据。一般会涉及到带參数的存储程序。当中參数用@来表示。

Create Procedure procedurename[:number] --[:number]表示一组存储程序中的第几个,假设仅仅有一个,此參数可忽略

[@parameter  data_type] [default] [OUTPUT]   --@parameter表示存储过程中的參数。default 表示默认值,OUTPUT表示输出值即输出值

as

SqlStatement   --[]代表可选參数

         3.详细运行过程

        

exec[ute] procedurename [參数]

       举例:

--创建

CreateProcedure scores

@score1smallint,

@score2smallint,

@score3smallint,

@score4smallint。

@score5smallint,

@myAvgsmallint Output    --Output可用return来取代

As select

@myAvg=(@score1+@score2+@score3+@score4+@score5)/5

--调用过程

Declare@avgscore smallint      --将输出结果放在avgscore中

Execavgscore Output 5,6,7,8,9,   --带有參数的存储过程调用时,必须加上Outputkeyword,否则SQL会当做參数来对待

   小结:存储程序的创建可分为带參数和不带參数,以及含有默认值和输出值得存储程序,可是它们的使用原理是一样的。

仅仅是带输出值得存储程序在调用过程中要使用keywordOutput来对要输出的变量进行声明,否则SQL会将它当做參数来处理。

注意:创建存储程序后,我们能够在编敲代码时,直接调用存储程序的名称来取代复杂的查询语句:

strSQL="select ............;"

strSQL="Execute procedureName;"

二、參数化SQL

   
是指在设计与数据库链接并訪问数据时,在须要填入数值或数据的地方,使用參数 (Parameter) 来给值,用@或?来表示參数。

    在使用參数化查询的情况下。数据库服务器不会将參数的内容视为SQL指令的一部份来处理,而是在数据库完毕 SQL 指令的编译后,才套用參数运行,因此就算參数中含有恶意的指令。因为已经编译完毕,就不会被数据库所运行,因此,可从一定程度上避免SQL注入。

參数化SQL在不同数据库中支持的方式有一定的区别。SQL server中二者均支持。

在不用的数据库上基本的语法都是一样的。但在不同的运行平台上client的书写有不同之处,在这里就拿如今我正在学习的SQL server在.net上运行来举例。

--SQL server中的參数化SQL语句:

SELECT * FROM myTable WHERE myID = @myID

INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
'.在.NET上运行

SqlCommand sqlcmd = new SqlCommand("INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)", sqlconn);

sqlcmd.Parameters.AddWithValue("@c1", 1); ' 设定參数 @c1 的值。

sqlcmd.Parameters.AddWithValue("@c2", 2); ' 设定參数 @c2 的值。

sqlcmd.Parameters.AddWithValue("@c3", 3); ' 设定參数 @c3 的值。

sqlcmd.Parameters.AddWithValue("@c4", 4); ' 设定參数 @c4 的值。

sqlconn.Open();

sqlcmd.ExecuteNonQuery();

sqlconn.Close();

在向command中添加參数时,还有其它的方法,如:

sqlcmd.parameters.Add("@c1",SqlDbType.BigInt)  'BigInt为c1的数据类型

sqlcmd.parameter("@c1").value=1     '设定值

三、Regular Expression

     简称REs是一种非常强大的文字验证技术。

通常我们在设计程序时,假设要在TEXT中输入数字的话,那么我们会用到IsNumberic函数来限制,可是非常多情况。为了用户方便。我们不止要用到限定数字这一个技术,还有非常多关系式须要我们去遵循,如手机号码要限定成11为。邮箱号码要限制对应的格式等。这时候就用到了REs这样的技术。它能够为我们要输入的内容提供一个模板。让用户的输入必须遵循这个模板的格式,假设格式不对,则程序不能继续运行。这样也能够避免SQL注入。

比如

\d   -------代表数字

\d{5}  -------代表5位数字

\w+@\w+ -------@前的w+表示要有至少一个的字符,@代表这个模板中必须有一个@字符。

当然在使用这样的技术之前。是有条件的,首先。它须要引用一个命名空间,详细例如以下:

Imports RE=System.Text.RegularExpressions.Regex

这样还不够,我们须要一个方法来做验证用户输入是否正确的工作,这里,我们要用到一个方法match。详细使用例如以下:

Dim input,pattern As String

Input=Me.txtInput.TextTrim()

Pattern=Me.txtPattern.Text

If  Re.Mathc(input,pattern).Success Then ‘使用Match方法来对用户输入的内容与定义好的模板进行验证

      MessageBox.Show("True,input matches pattern")

Else

       MessageBox.Show("False,input does not match pattern")

End if

以上,是通过看.net视频总结出来的避免SQL注入的三种方法,因为对专业知识了解有限。详细原理并不清楚。有待以后深入学习后总结。

        





最新文章

  1. 八爪鱼招标网的百度权重升为2了,独立IP也从0快速发展为1000
  2. ibatis map
  3. Mac下如何配置环境变量
  4. 转:php park、unpark、ord 函数使用方法(二进制流接口应用实例)
  5. 20145225 实验四《Andoid开发基础》
  6. 在Spring4中使用通用Mapper
  7. ID@Xbox计划宣传片 XboxOne喜迎大波小游戏(转)
  8. 关于Unity
  9. vb.net之窗体继承
  10. Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询
  11. C++中使用多线程
  12. Java - 反射机制(Reflection)
  13. JAVA中的break[标签]continue[标签]用法
  14. 74HC595的中文资料
  15. Eclipse安装svn插件的几种方式 转帖....
  16. Django使用redis实现缓存
  17. 2.5 Visio2007不规则图形填充
  18. AndroidStudio 开发JNI
  19. web自动化测试---概述
  20. RedHat6.5安装Spark单机

热门文章

  1. token 与 基于JWT的Token认证
  2. Linux网桥端口的arp问题
  3. C++ 字符串、string、char *、char[]、const char*的转换和区别
  4. 关于MQ 消息队列的通俗理解和 rabbitMQ 使用
  5. 解析Request和Response
  6. Python学习day06-Python基础(4)流程控制之while和for循环
  7. mysql emoji存储问题
  8. ES6之主要知识点(六)数组
  9. c# asp.net 修改webconfig文件 配置
  10. 2018-10-19-C#-序列类为-xml-可以使用的特性大全