避免SQL注入三慷慨法
要说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注入三慷慨法的更多相关文章
- WEB 安全之 SQL注入 < 三 > 提权
SQL注入是一个比较“古老”的话题,虽然现在存在这种漏洞的站点比较少了,我们还是有必要了解一下它的危害,及其常用的手段,知己知彼方能百战不殆.进攻与防守相当于矛和盾的关系,我们如果能清楚了解 攻击的全 ...
- SQL注入(三)
邮给我一个密码 我们意识到虽然不能添加一条新的记录在members表中,但我们可以通过修改一个存在的记录, 这也获得了我们的证明是可行的. 从先前的步骤中,我们知道bob@example.com在系统 ...
- 常见的网络攻击(XSS,SQL注入,CSRF)
一.XSS 二.SQL注入 三.CSRF
- Python--day46--mysql存储过程(不常用)(包含防sql注入)
一.存储过程: 优点:只要传很少的数据到数据库就可以了 缺点:dba管理数据库的时候可能会对数据库进行了更改了那一坨sql语句. 二.创建存储过程: 1.简单 创建存储过程: Python中使用结果 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击
第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...
- 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
一.JDBC的概述###<1>概念 JDBC:java database connection ,java数据库连接技术 是java内部提供的一套操作数据库的接口(面向接口编程),实现对数 ...
- SQL注入过WAF(11.4 第三十三天)
WAF是什么? Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).也叫Web防火墙,主要是对Web特有入侵方式的加强防护,如D ...
- DVWA(三):SQL injection 全等级SQL注入
(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...
随机推荐
- python事件调度库sched
事件调度 sched模块内容很简单,只定义了一个类.它用来最为一个通用的事件调度模块. class sched.scheduler(timefunc, delayfunc)这个类定义了调度事件的通用接 ...
- java定时器demo
package cn.threadtest.thread; import java.util.Date; import java.util.Timer; import java.util.TimerT ...
- Linux 日期时间命令
cal : 显示日历 -1 显示一个月的月历 -3 显示系统前一个月,当前月,下一个月的月历 -s 显示星期天为一个星期的第一天,默认的格式 -m 显示星期一为一个星期的第一天 -j 显示在当年中 ...
- PAT甲级——A1003Emergency
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- re 模块 (正则的使用)
一.正则表达式 英文全称: Regular Expression. 简称 regex或者re.正则表达式是对字符串操作的一种逻辑公式. 我们一般使用正则表达式对字符串进行匹配和过滤. 使用正则的优缺点 ...
- java流对象
Java和C++都是静态类型的面向对象编程语言 stream结尾都是字节流,reader和writer结尾都是字符流 区别: 就是读写的时候一个是按字节读写,一个是按字符. 实际使用通常差不多. 在读 ...
- 轻量级IoC框架Ninject.NET搭建
说在之前的话 IOC的概念相信大家比较熟悉了,习惯性称之为依赖注入或控制反转,园子里对基于MVC平台IOC设计模式已经相当多了,但大家都只知道应该怎么应用一个IOC模式,比如Ninject, Unit ...
- CodeForces - 1087D
CodeForces - 1087Dhttps://vjudge.net/problem/2115151/origin2*和/叶子结点的个数 #include<iostream> #inc ...
- PostgreSQL 优化器代码概览
简介 PostgreSQL 的开发源自上世纪80年代,它最初是 Michael Stonebraker 等人在美国国防部支持下创建的POSTGRE项目.上世纪末,Andrew Yu 等人在它上面搭建了 ...
- 线性基(模板) LUOGU 3812
题面 解题思路 线性基,是构造出一组数:ax,ax-1-.a1,ax的二进制最高位为x.这些数字能异或和可以表示原来所有数的异或和.其实相当于一个高斯消元的过程.所以我们按位枚举,如果这一位曾经没数, ...