音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

SQL 注入式攻击的终极防范
日期:2021-09-05 22:10:01   来源:脚本之家

在讲这个问题之前让我们来先看一段代码:
复制代码 代码如下:

dim sql_injdata,SQL_inj,SQL_Get,SQL_Data,Sql_Post
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=javascript>alert('SQL防注入系统提示,请不要在尝试注入!');history.back(-1)</Script>"
Response.end
end if
next
Next
End If
If Request.Form<>"" Then
For Each Sql_Post In Request.Form
For SQL_Data=0 To Ubound(SQL_inj)
if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
Response.Write "<Script Language=javascript>alert('SQL防注入系统提示,请不要在尝试注入!');history.back(-1)</Script>"
Response.end
end if
next
next
end if

这是一段在互联网上广泛流行的ASP防注入的代码,其思想是通过对Post方法和Get方法提交的数据进行检查,通过过滤Insert、Update、And等等这些敏感字符的办法来防止受到SQL注入式的攻击,从理论上来说如果我们过滤了足够多的字符那是绝对可以保证不会受到SQL注入式攻击的,但是请再仔细阅读一下这段代码,注意一下它的判断方式,它是通过instr函数来判断的,也就是说如果我要过滤and字符,实际上被过滤的不仅仅是And这个单词,同时把所有包含and这种字符组合方式的所有单词都给过滤掉了,比如island、mainland、hand…………,如果把这些字符都过滤了还有人会愿意用吗?所以这种过滤敏感字符的方法根本就没有意义,让我比较意外的是这么一个垃圾东西居然在互联网上被人奉为经典的贴来贴去,真是无语。
有人说SQL注入式攻击是因为拼接SQL查询字符串造成的,所以使用存储过程不使用拼接SQL查询字符串的方式可以不受SQL注入式的攻击,真是这样吗?不见得,下面再让我们来看一个存储过程被注入攻击的例子。
存储过程dt_GetNews代码如下:
CREATE PROCEDURE dt_GetNews
@newstype int
AS
select * from news where newstype=@newstype
GO
调用的代码:
<%
dim adoconnection
set adoconnection=server.createobject("adodb.connection")
'…………这里省略了建立数据库连接的相关代码
adoconnection.execute "exec dt_GetNews "+request("newstype")
adoconnection.close
%>
如果request("newstype")的值等于1,运行的结果是返回news表中所有newstype字段为1的记录,但是如果request("newstype")的值是"1;drop table news"呢,返回的结果是news表被删除。
从这个例子中可以看出来即便是用存储过程同样也会被攻击,再说了select * from news where newstype=@newstype难道就不是拼接,所以说拼接SQL查询字符串和SQL注入攻击之间没有必然的联系,存储过程也不一定能防御注入式攻击。
那么究竟怎么写才不会受到SQL注入攻击呢,下面我就介绍一种终极方法,说白了很简单也很原始就是数据类型验证加单引号替换。不管是Oracle、Sql Server还是mySql、Access还是别的关系数据库,字段的类型大体上可以分为两大类:数值型(如:int、float等)和字符型(如:char、varchar等),根据字段类型的不同对应的SQL语句也略有区别,比如:
“Select * from news where newstype=1”里面newstype字段必然是一个数值型的字段,
”select * from news where newstype='社会新闻'”里面newstype字段必然是一个字符型的字段。
针对数值型的字段,我们必须要做的是一定要检查参数的数据类型,比如我们用”select * from news where newstype=”+v_newstype这种方式构造查询语句的时候必须检查v_newstype变量的数据类型,v_newstype至少得是一个数,可以是整数也可以是浮点数,如果作了这样的检查,”select * from news where newstype=”+v_newstype这种方式就绝对不会构造出类似”select * from news where newstype=1;drop table news”这样的语句。ASP相对ASP.Net、JSP等更容易受到攻击的原因,就是因为在ASP中变量可以不用申明以及变量类型不明确导致的。
针对字符型的字段,我们必须要做的是一定要处理单引号('),处理的方法就是将一个单引号替换成两个的单引号(‘'),比如我们用”select * from news where newstype='”+v_newstype+”'”这种方式构造查询语句的时候必须将v_newstype里的单引号替换成两个单引号,因为在SQL中被两个单引号括起来的部分表示一个字符串,而连续的两个单引号则表示一个单引号字符,做了这样的处理以后再来看”select * from news where newstype='”+v_newstype+”'”这种构造方式,当v_newstype的值为:
“社会新闻';drop table news--”
经过一个单引号到两个单引号的替换后v_newstype的值就成了:
“社会新闻'';drop table news--”
构造出来的SQL语句成了:
”select * from news where newstype='社会新闻'';drop table news—‘”
查询的结果是返回news表中newstype字段的值为”社会新闻';drop table news--”的记录,而并不会像之前那样造成news表被删除的后果。
另外,需要做处理的不仅仅是Select语句,包括Insert、Update、Delete、Exec等等都需要处理,大家可以再看看以下这几种注入方式:
在"insert into news(title) values('"+v_title+"')"这种构造中,
当v_title="123';drop table news--'"的时候;
在"update news set title='"+v_title+"' where id="+v_id这种构造中,
当v_title="123'--" 或者 v_id="1;drop table news--" 的时候,所以不光是Select语句的问题,其他语句都可能会有问题,不要仅仅盯着Select
总之,做好了数据类型的验证和单引号字符的处理以后,就算它孙猴子有万般能耐也飞不出我如来的掌心。

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程