看了网上的大多防SQL攻击程序,自己编写了一个函数,比较完美。大家一起测测~

wenzhoufeng 2006-02-25 11:48:55
ASP使用者不使用request,用SafeRequest("","","")函数来代替

本SQL防止了Cookies的绕过攻击,具体解说看下面。配合自己编写一个数据库来记录与判断黑名单功能即可

希望有人与我交流~~

<%
dim full,checkip
checkip=userIP()
'===============
'这里判断黑名单数据库中的IP统计50条启示与checkip条件符合的IP
'response.write "已经不可提交数据,本网拒绝您提交任何数据!"
'response.redirect "返回到别的页,增加流量:……——……"
'response.end
'===============

a=safeRequest("action",0,2)
Response.write "防sql后的结果为:"&a'输出过滤好的代码
'*********************************************
' 防止SQL注入的安全SafeRequest函数 清风一吹编写 QQ:99748954
' 有好意见与修改之处,请您联系我,完善SQL注入,在此感谢!, 我写错了可能是我的错,你知道错在哪里不告诉我,你就真的错了!^_^
'--- 传入参数 ---
'ParaName:参数名称-字符型
'ParaType:参数类型-数字型(1表示以上参数是数字,0表示以上参数为字符)
'RequestType:参数类型-数字型(1表示为Request.form方式 0表示为Request.querystring方式 2表示为Request.cookies方式
'对攻击者进行日志记录,对攻击者日志作50条限制则禁用此IP及计算机名标识的提交访问非浏览页面禁用,以免造成DDOS攻击造成爆库
'----解说完毕----
'*********************************************
Function SafeRequest(ParaName,ParaType,RequestType)
On Error Resume Next
Para1=isNumeric(ParaType)
Request1=isNumeric(RequestType)
if para1=false or Request1=false then
response.write "ParaType,RequestType参数类型错误"
response.end
end if
Dim ParaValue
'判断当前提交的URL是否为本地
dim str,host,url,keyword
str="http://"
host = Request.ServerVariables("HTTP_HOST")
url = Request.ServerVariables("PATH_INFO") '或url
keyword = Request.ServerVariables("QUERY_STRING")
if keyword <> "" then
full = str&host&url&"?"&keyword
else
full = str&host&url
end if
server_v2=Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(full,8,len(server_v2))<>server_v2 then
Response.write "外部提交数据,防SQL攻击程序拦截:你已经被我网定位为凝视攻击者,您的IP地址是:"&checkip&" 当前时间:"&now()&" 您访问的页面为:"&full&" 我们有权对您采取反攻击·"
response.end
end if

select case RequestType '采用此方法分类吸收提交值,避免Request吸收本地cookies值而达到的SQL注入攻击
case 0
'调用Get方法SQL注入判断
ParaValue=Lcase(Request.Querystring(ParaName))
CheckGet(ParaValue)
case 1
ParaValue=Lcase(Request.form(ParaName))
'调用Post方法SQL注入判断
Checkpost(ParaValue)
case 2
'调用cookies注入判断方法
ParaValue=Lcase(Request.cookies(ParaName))
ParaValue=SafeStr(ParaValue)'现在基本乘下cookies了,经过上面的过滤已经达到了防cookies注入攻击
end select

If ParaType=1 then'若传递过来的不是数字,判断为SQL注入攻击!
If not isNumeric(ParaValue) then
Response.write "错误提交数据,防SQL攻击程序拦截:你已经被我网定位为凝视攻击者,您的IP地址是:"&checkip&" 当前时间:"&now()&" 您访问的页面为:"&full&" 我们有权对您采取反攻击·"
Response.end
End if
Else
'传递过来是字符串型,过滤敏感字符
ParaValue=SafeStr(ParaValue)
end if
SafeRequest=ParaValue
End function

function SafeStr(ParaValue1)
ParaValue1=replace(replace(replace(replace(replace(replace(replace(ParaValue1,"'",""),"*",""),"?",""),"(",""),")",""),"<",""),".","")
ParaValue1=replace(replace(replace(replace(replace(replace(ParaValue1,"and",""),"exec",""),"insert",""),"select",""),"delete",""),"update","")
ParaValue1=replace(replace(replace(replace(replace(replace(ParaValue1,"count",""),"*",""),"%",""),"chr",""),"mid",""),"master","")
ParaValue1=replace(replace(replace(replace(ParaValue1,"truncate",""),"char",""),"declare"),"sa","")
SafeStr=ParaValue1
end function


sub CheckGet(Getstr)
dim sql_injdata
SQL_injdata = "' and exec insert select delete update count * % chr mid master truncate char declare master mid chr count char truncate < > ) ( or ? sa backup ."
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 "Get非法,防SQL攻击程序拦截:你已经被我网定位为凝视攻击者,您的IP地址是:"&checkip&" 当前时间:"&now()&" 您访问的页面为:"&full&" 我们有权对您采取反攻击·"
'调用日志函数
call AddLog()
'调用反攻击程序
Response.end
end if
next
Next
End If
end sub


sub CheckPost(Getstr)
dim sql_injdata
SQL_injdata = "' and exec insert select delete update count * % chr mid master truncate char declare master mid chr count char truncate < > ) ( or ? sa backup ."
SQL_inj = split(SQL_Injdata," ")
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 "POST非法,防SQL攻击程序拦截:你已经被我网定位为凝视攻击者,您的IP地址是:"&checkip&" 当前时间:"&now()&" 您访问的页面为:"&full&" 我们有权对您采取反攻击·"'调用日志函数
call AddLog()
'调用反攻击程序
Response.end
end if
next
next
end if
end sub


sub AddLog()
response.write "<br><br>攻击者写进写进日志,入库前判断该IP是否50条,满则不入库!"
'编写个数据库入库及判断记录数'传递IP地址
'将攻击者的信息入到LOG日志中,每个攻击者最多只能拥有50条记录,一旦达到50条日志拒绝此IP及计算机名身份访问,以免造成DDOS攻击,将数据库撑爆
end sub

Function userIP()
if Request.ServerVariables("HTTP_X_FORWARDED_FOR")=empty then
remoteaddr=Request.ServerVariables("REMOTE_ADDR")
else
remoteaddr=Request.ServerVariables("HTTP_X_FORWARDED_FOR")
end if
userIP=remoteaddr
end Function

%>
...全文
631 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxcooi 2006-02-28
  • 打赏
  • 举报
回复
关于asp防注入我的测试观点是:
替换单引号.

关于adodb.command当然可以,但不幸的事实是:
从vb起所有脚本的访问对像速度奇慢无比.如果使用adodb.command则需要多次使用对像的属性.造成执行速度下降.asp优化很大部份是减少对对像的访问.

所以最好的办法还是字符串搭建.replace替换单引号.
wtogether 2006-02-28
  • 打赏
  • 举报
回复
防止SQL注入,微软早就提供过组件,不过很多人都用在存储过程上,其实用在SELECT,INSERT,UPDATE,DELETE上都可以的,这个组件叫adodb,调用adodb.command对象,用CommandText属性来规范数据入口,非常安全,不管你加任何字符注入都白搭
hacker18 2006-02-28
  • 打赏
  • 举报
回复
太复杂了!就不能简单点儿吗?
zhlym 2006-02-28
  • 打赏
  • 举报
回复
老問題重提,提到不要緊,都是只考慮中文的,英文的就不行了
lxhbysn 2006-02-28
  • 打赏
  • 举报
回复
一通狂替换是不行的,最简单的例子就是如果需要包含select这个字符,怎么办?!
数据岂不是错误了?
kaijier 2006-02-26
  • 打赏
  • 举报
回复
没必要
-----------------
实在话
best_threewood 2006-02-26
  • 打赏
  • 举报
回复
eteek 2006-02-26
  • 打赏
  • 举报
回复
学习方法与观点
isloop 2006-02-26
  • 打赏
  • 举报
回复
--------------------------
似乎, 现在使用asp写WEB 应用, 过时了吧.......
--------------------------
应该说已经到了衰老期了,过时倒还不至于,至少在小地方大部分还都是用这个,最主要的是开发成本底,学着容易上手,程序员的工资也不高,租个空间也便宜,开块地就能放,不像Java那样还得在Server.xml里配置连接池……,总之就是花钱少,所以还很受一些小企业欢迎。呵呵。。。
computerclass 2006-02-26
  • 打赏
  • 举报
回复
学习一下。收藏
realdreamer 2006-02-26
  • 打赏
  • 举报
回复
似乎, 现在使用asp写WEB 应用, 过时了吧.......
realdreamer 2006-02-26
  • 打赏
  • 举报
回复
将'替换成'', 不是好的解决办法 . 虽然我对ADO 很久没碰,但记得ado 里的查询应该有参数绑定查询. 而不要使用字符串连接来拼凑查询字符串.

像 java 里的 PreparedStatement 对象, 和 PreparedStatement.setXXXXX 系列方法, 由驱动程序来处理'问题会更好. 代码也更直观易读, 绝对比拼凑的SQL 语顺好维护
lindenrty 2006-02-25
  • 打赏
  • 举报
回复
需要这么复杂吗...
wl_szl 2006-02-25
  • 打赏
  • 举报
回复
wyc8833 2006-02-25
  • 打赏
  • 举报
回复
水平有限,只能在此顶一下
wenzhoufeng 2006-02-25
  • 打赏
  • 举报
回复
增加cookies遍历功能更加完美,不过本人认为这样已经可以达到这种效果了。避免了直接采用request的这个漏洞
satans18 2006-02-25
  • 打赏
  • 举报
回复
先顶~
liuzhanpeng 2006-02-25
  • 打赏
  • 举报
回复
非常没必要....
yuliang0828 2006-02-25
  • 打赏
  • 举报
回复
支持楼上们的说法,想法不错,实在没有必要,一般也就是判断一下数字,然后把'替换了,估计没有了'你再高深的注入也没办法了吧?
lymyx 2006-02-25
  • 打赏
  • 举报
回复
有时咱们没有必要写的这么全,占用系统资源的。
解析也慢。
加载更多回复(6)

28,406

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧