版权声明:本文为博主原创文章,未经博主同意不得转载。 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. 爬虫——python——百度地图经纬度查询——经纬度查看地点地名——利用百度API获取地名经纬度——爬取所有的中国地址

    import requests address = '40.8587960,86.866991' url = 'http://api.map.baidu.com/geocoder?output=jso ...

  2. Docker系列(十一):Kubernetes集群集群部署实践

    Kubernetes分布式集群架构 服务注册和服务发现问题怎么解决的? 分布式通讯的核心就是ip加端口 每个服务分配一个不变的虚拟IP+端口 系统env环境变量里有每个服务的服务名称到IP的映射 如下 ...

  3. PAT甲级——A1068 Find More Coins

    Eva loves to collect coins from all over the universe, including some other planets like Mars. One d ...

  4. uploadify附件上传 传参

    首先 在刚加载jsp时就加入上传方法,所以 formDate 中的参数 zFileName是页面刚加载时 exp1的值 ,后来通过js方法赋值不被读过来,如果 你想要获得这个值,可在 调用upload ...

  5. centos部署jeecms

    首先下载安装包apache-tomcat-8.5.40.tar.gz jdk-8u211-linux-x641.rpm jeecmsv9.war 已经在WEB-INF/config/jdbc.prop ...

  6. Python学习day02 - 编程分类和Pycharm和Jupyter的安装

    编程语言分类 编程语言是用来和计算机交互的,计算机只认识0和1 机器语言(低级语言) 直接和硬件交互 用0和1和计算机沟通 优点:执行效率最高 缺点:开发效率低 汇编语言直接和硬件交互 优点(相较于机 ...

  7. day71test

    目录 练习: settings.py views.py: exception.py urls.py 练习: 视图类渲染,解析, 异常配置: 作业: 1..简单过过请求模块的源码流程,建立一个视图类,完 ...

  8. hexo_localhost:4000_无法访问

    title: 'hexo_localhost:4000_无法访问' date: 2016-05-02 09:38:51 categories: blog tags: [hexo] 问题描述 安装完成h ...

  9. PKU 百炼OJ 简单密码

    http://bailian.openjudge.cn/practice/2767/ #include<iostream> #include <cmath> #include ...

  10. MySQL模拟Oracle序列使用

    https://www.runoob.com/mysql/mysql-using-sequences.html   一篇笔记开始看 注意:创建序列表时一定要有 主键id自增,否则为只读状态不能修改递增 ...