防止sql注入

erjian2022-03-2829825

防止sql注入与注入

要谈论SQL注入,我们应该从观察开始。网络视频。据说在程序开发过程中,我们经常会遇到SQL注入问题,即指令隐藏代码攻击。具体原理是什么?我查了一些资料,好像涉及到编译原理,但是看不懂。只是这三种方法是最常用的,也是经常用来避免SQL注入的方法,所以我查了一些资料,希望对所学有一定的了解。下面简单介绍一下这三种方法的使用方法。

一.存储程序

我是在学数据库视频的时候接触的。它是存储在数据库中的一些预编译指令。使用时不需要重写,直接调用即可。因此,使用它可以大大提高程序的执行效率。

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

1.创作过程

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

2.创建特定的语法

在创建存储程序时,为了处理各种转换后的数据,通常会涉及到一个带参数的存储程序,其中的参数用@

[]-[]表示哪个存储程序在一个组中。如果只有一个存储程序,可以忽略该参数。

[@] [] []-@表示存储过程中的参数,默认值,输出值asSqlStatement - [] []表示可选参数。

3.具体实施过程

Exec[ute]procedurename[参数]

示例:

防止sql注入与注入

-创建

createprocedures cores @ score 1 smallint、@score2smallint、@score3smallint、@score4smallint、@score5smallint、@ myavgsmalintoutput-output可以用return替换。

select @ myavg=(@ score 1 @ score 2 @ score 3 @ score 4 @ scoe 5)/5-调用过程

Declare@avgscoresmallint -将输出结果放入avgscore。

AvgscoreOutput 5,6,7,8,9-调用带参数的存储过程时,必须添加Output关键字,否则SQL将被视为参数。

总结:存储程序的创建可以分为带参数的存储程序和不带参数的存储程序,以及带默认值和输出值的存储程序,但它们的使用原理是一样的。只有带输出值的存储程序才应该在调用过程中使用关键字Output来声明要输出的变量,否则SQL会将其作为参数处理。

注意:创建存储程序后,我们可以在编写程序时直接调用存储程序的名称,而不是复杂的查询语句:

strSQL='select..'strSQL=' ExecuteprocedureName'

第二,参数化SQL

它是指在需要填写数值或数据的地方使用Parameter给出值,并使用@或?来表示参数。

在参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分,而是仅在数据库完成SQL指令的编译后应用参数来运行。因此,即使参数中包含恶意指令,由于编译已经完成,也不会被数据库运行,因此可以在一定程度上避免SQL注入。

不同的数据库以不同的方式支持参数化SQL。SQLserver支持这两者。

不同的数据库基本语法是一样的,但是客户端的编写在不同的平台是不一样的,这里就以我现在学习的SQLserver为例。

-参数化SQL语句3 in-SQL server3360Select * from my table where mild=@ Mydinsertintomytable(C1,C2,C3,C4)值(@ C防止sql注入1,@ C2,@ C3,@ C4)'。它于执行。网。

SqlCommandsqlcmd=newsql command(' INSERTINTOmyTable(C1,c2,c3,c4)值(@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();

还有其他方法可以向命令添加参数,例如:

Sqlcmd.parameters.add ('@ c1 ',sqldbtype.bigint)' bigint是c1的数据类型。

sqlcmd.parameter(

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

三、RegularExpression

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

例如

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

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

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

当然在使用这种技术之前,是有条件的,首先,它需要引用一个命名空间,具体如下:

ImportsRE=System.Text.RegularExpressions.Regex

这样还不够,我们需要一个方法来做验证用户输入是否正确的工作,这里,我们要用到一个方法match,具体使用如下:

Diminput,patternAsString

Input=Me.txtInput.TextTrim()

Pattern=Me.txtPattern.Text

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

MessageBox.Show("True,inputmatchespattern")ElseMessageBox.Show("False,inputdoesnotmatchpattern")Endif

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

防止sql注入的方法和原理

这里详细说下防止结构化查询语言注入的原理

1.代码层手动过滤

首先看下的源码,可以看到对参数做了一定的处理,比如增加单引号,对换行符等一些字符做了转义处理,也就是说封装了一些代码层手动过滤,

经过方法对输入字符串参数进行处理后,消除了一部分结构化查询语言注入的威胁

(,)throwsSQLException { synchronized(this。支票已结清().getconnection mutex()){ if(x==null){ this。set null(参数索引,1);} else { this。检查关闭();intstringLength=x . length();StringBufferbufif(这个。联系。isnobackslashescapesset()){ booleaneedshexcept=this。isescapeneededforstring(x,字符串长度);ObjectparameterAsBytesbyte[]参数以字节表示;如果(!needsHexEscape){ parameter as bytes=null;buf=new string buffer(x . length()2);buf。追加(' \ ' ');buf。追加(x);buf。追加(' \ ' ');如果(!这个。isloaddataquery){ parameter as bytes=string utils。getbytes(buf。tostring()、this.charConverter、this.charEncoding、this。联系。getservercharacterencoding()、this。联系。parserknowsunicode()、this。getexception拦截器());} else {参数as bytes=string utils。getbytes(buf。tostring());}这个。set internal(参数索引,参数为字节);} else { parameterAsBytes=null如果(!这个。isloaddataquery){ parameter as bytes=string utils。getbytes(x,this.charConverter,this.charEncoding,this。联系。getservercharacterencoding(),this。联系。parserknowsunicode(),这个。getexceptioninterceptor());} else {参数as bytes=string utils。getbytes(x);}this.setBytes(parameterIndex,参数as bytes);}返回;} StringparameterAsString=x;booleaneedsquoted=true if(this。isloaddataquery | |这个。isescapeneededforstring(x,字符串长度)){ needsQuoted=falsebuf=new string buffer((int)((double)x . length()* 1.1D));buf。追加(' \ ' ');for(inti=0;istringLengthI){ charc=x . charat(I);开关(c)3360基金会。追加(' \ \ ');buf。追加(“0”);打破;案例

:buf。追加(' \ \ ');buf。追加(' n ');打破;案例:buf。追加(' \ \ ');buf。追加(' r ');打破;案例\ u001a ' :buf。追加(' \ \ ');buf。追加(' Z ');打破;案例””:如果(此。使用ansi模式){ buf。追加(' \ \ ');} buf。追加(“”);打破;案例”:buf。追加(' \ \ ');buf。追加(' \ ' ');打破;案例\ \ ' :buf。追加(' \ \ ');buf。追加(' \ \ ');打破;案例’‘:3360case''3如果(这。字符集编码器!=null){ CharBuffercbuf=char buffer。分配(1);字节缓冲区。分配(1);cbuf。放(c);cbuf。位置(0);这个。字符集编码器。encode(cbuf,bbuf,true);如果(bbuf。get(0)==92){ buf。追加(' \ \ ');} }默认:缓冲区。追加(c);} } buf。追加(' \ ' ');参数asstring=buf。tostring();} buf=nullbyte[]参数以字节表示;如果(!这个。isloaddataquery){ if(needsQuoted){ parameter as bytes=string utils。getbytes wrapped(参数asstring,' \ ' ',' \ ' ',this.charConverter,this.charEncoding,this。联系。getservercharacterencoding(),this。联系。parserknowsunicode(),这个。getexceptioninterceptor());} else {参数as bytes=string utils。getbytes(参数为string,this.charConverter,this.charEncoding,this。联系。getservercharactercencoding(),this。联系。parserknowsunicode(),这个。getexceptioninterceptor());} } else {参数as bytes=string utils。getbytes(参数为字符串);}这个。set internal(参数索引,参数为字节);这个。参数类型[参数索引-1本。getparameter index offset()]=12;}}}

2.预编译功能

预编译的功能是在服务端开启的,mysql预编译功能默认是关闭的,通过对jdbcurl追加以下参数来开启useserverpestmts=true cacheprepstmts=true

相关阅读

  • 会有天使替会有天使替我爱你歌曲我爱你
  • 《会有天使替我爱你》的插曲叫什么?
  • 防止sql注入
  • 本文链接:http://www.slxf119.com/16619.html 转载需授权!

    上一篇:《会有天使替我爱你》的插曲叫什么?

    下一篇:数据库安全审计应用实践系列文章之三 数据库安全之内外兼顾 图

    相关文章

    网友评论