版权声明:本文为博主原创文章,未经博主同意不得转载。 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注入的三种方法,因为对专业知识了解有限。详细原理并不清楚。有待以后深入学习后总结。

        





避免SQL注入三慷慨法的更多相关文章

  1. WEB 安全之 SQL注入 < 三 > 提权

    SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...

  2. SQL注入(三)

    邮给我一个密码 我们意识到虽然不能添加一条新的记录在members表中,但我们可以通过修改一个存在的记录, 这也获得了我们的证明是可行的. 从先前的步骤中,我们知道bob@example.com在系统 ...

  3. 常见的网络攻击(XSS,SQL注入,CSRF)

    一.XSS 二.SQL注入 三.CSRF

  4. Python--day46--mysql存储过程(不常用)(包含防sql注入)

    一.存储过程: 优点:只要传很少的数据到数据库就可以了  缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...

  5. SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)

    0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...

  6. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  7. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入

    一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...

  8. SQL注入过WAF(11.4 第三十三天)

    WAF是什么? Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如D ...

  9. DVWA(三):SQL injection 全等级SQL注入

    (本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

随机推荐

  1. npm 安装vue 报错Failed at the chromedriver@2.34.0 install script 'node install.js'

    提示版本不够,后来百度到,在你的vue项目包下执行: npm install chromedriver --chromedriver_cdnurl=http://cdn.npm.taobao.org/ ...

  2. VS2010-MFC(对话框:创建对话框模板和修改对话框属性)

    转自:http://www.jizhuomi.com/software/149.html 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框, ...

  3. HttpException (0x80004005): 无法连接到 SQL Server 会话数据库

    ASP.NET 项目运行时出现错误提示:[HttpException (0x80004005): 无法连接到 SQL Server 会话数据库.] ,后排查问题发现是由于项目的Session模式是使用 ...

  4. mysql的root用户被删除, MySQL 服务无法启动 1067错误

    本文出现的问题有: 1, root(localhost) 用户被删除; 2, 在关闭mysql服务过后, 无法启动,出现1067错误; 我使用的mysql版本为5.6; mysql的安装路径: C:\ ...

  5. 路飞学城-Python爬虫集训-第二章

    本次爬虫集训的第二次作业是web微信. 先贴一下任务: 作业中使用到了Flask. Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模 ...

  6. STL容器-deque-双端队列

    注明:全部来自转载,供自己学习与复习使用 deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存连续的假象. 其实deque由一 ...

  7. 1.Spring【IOC】XML方式

    1.下载开发包 http://repo.springsource.org/libs-release-local/org/springframework/spring 2.创建WEB工程,引入jar包 ...

  8. 12.Hibernate多对多关系

    JavaBean的编写 Person private long pid ; private String name ; private Set<Role> roles = new Hash ...

  9. 图解nginx配置负载均衡

    1. 在Linux上准备两份tomcat 2. 修改两份tomcat的端口号 修改的端口如图所示: 3. 启动两个tomcat服务器 4. 修改两个服务器上的主页方便测试区分 5. 在nginx配置文 ...

  10. $cordovaNetwork 使用

    1 .安装插件 直接安装: cordova plugin add cordova-plugin-network-information 下载到本地安装: https://github.com/apac ...