5月与周亚话,短信回之
相识琅琊涕泪甬,
梦绕奇石字涩形。
我今遥远扬州地,
君处秀才余野人。
糊涂路程糊涂语,
剌剌也怄伤嬉心。
……
全为思念之语,没什么其他
<%
Option Explicit
dim databasename '定义数据库名称
databasename="database.mdb" '数据库名称
dim databasepath '定义数据库存放路径
databasepath="D:\office\jd\21\database\" '数据库绝对路径
dim databasever '定义数据库版本 2000 或者 97
databasever = "2000"
Function Createdfile(FilePath,FileName,Ver)
Dim Ca,dbver
select case ver
case "97"
dbver = "3.51"
case "2000"
dbver = "4.0"
end select
if dbver <> "" then
Set Ca = Server.CreateObject("ADOX.Catalog")
call Ca.Create("Provider=Microsoft.Jet.OLEDB." & dbver & ";Data Source=" & filepath & filename)
end if
End Function
Createdfile databasepath,databasename,databasever '创建数据库
%>
本来用asp创建数据库是没有什么用处的
SQL语句的添加、删除、修改虽然有如下很多种方法,但在使用过程中还是不够用,不知是
否有高手把更多灵活的使用方法贡献出来?
添加、删除、修改使用db.Execute(Sql)命令执行操作
╔—————-╗
☆ 数据记录筛选 ☆
╚—————-╝
注意:单双引号的用法可能有误(没有测式)
Sql = "Select Distinct 字段名 From 数据表"
Distinct函数,查询数据库存表内不重复的记录
Sql = "Select Count(*) From 数据表 where 字段名1>#18:0:0# and 字段名1< #19:00# "
count函数,查询数库表内有多少条记录,“字段名1”是指同一字段
例:
set rs=conn.execute("select count(id) as idnum from news")
response.write rs("idnum")
sql="select * from 数据表 where 字段名 between 值1 and 值2"
Sql="select * from 数据表 where 字段名 between #2003-8-10# and #2003-8-12#"
在日期类数值为2003-8-10 19:55:08 的字段里查找2003-8-10至2003-8-12的所有记录,而
不管是几点几分。
select * from tb_name where datetime between #2003-8-10# and #2003-8-12#
字段里面的数据格式为:2003-8-10 19:55:08,通过sql查出2003-8-10至2003-8-12的所有
纪录,而不管是几点几分。
Sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
Sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
模糊查询
Sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
查找数据库中前10记录
Sql="select top n * form 数据表 order by newid()"
随机取出数据库中的若干条记录的方法
top n,n就是要取出的记录数
Sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
╔—————-╗
☆ 添加数据记录 ☆
╚—————-╝
sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 数据表 valuess (值1,值2,值3 …)"
不指定具体字段名表示将按照数据表中字段的顺序,依次添加
sql="insert into 目标数据表 select * from 源数据表"
把源数据表的记录添加到目标数据表
╔—————-╗
☆ 更新数据记录 ☆
╚—————-╝
Sql="update 数据表 set 字段名=字段值 where 条件表达式"
Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
Sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n "
没有条件则更新整个数据表中的指定字段值
╔—————-╗
☆ 删除数据记录 ☆
╚—————-╝
Sql="delete from 数据表 where 条件表达式"
Sql="delete from 数据表"
没有条件将删除数据表中所有记录)
╔——————–╗
☆ 数据记录统计函数 ☆
╚——————–╝
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加
引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统的计值,其它函数运用同上。
╔———————-╗
☆ 数据表的建立和删除 ☆
╚———————-╝
Create TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:Create TABLE tab01(name varchar(50),datetime default now())
Drop TABLE 数据表名称 (永久性删除一个数据表)
╔——————–╗
☆ 记录集对象的方法 ☆
╚——————–╝
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录
Sub DeleteAFile(dfile)
'On Error Resume Next
Dim fso, MyFile
Set fso = CreateObject("Scripting.FileSystemObject")
Set MyFile = fso.GetFile(Server.MapPath(dfile))
MyFile.Delete true
set MyFile=nothing
set fso=nothing
End Sub
DeleteAFile("temp.asp")
修改一下,增加了,检查文件是不是存在的功能,代码如下:
Sub DeleteAFile(dfile)
'On Error Resume Next
Dim fso, MyFile
Set fso = CreateObject("Scripting.FileSystemObject")
if fso.fileexists(Server.MapPath(dfile)) then
response.write "文件是存在的"
else
response.write "文件是不存的"
response.end
end if
Set MyFile = fso.GetFile(Server.MapPath(dfile))
response.write MyFile
response.end
MyFile.Delete true
set MyFile=nothing
set fso=nothing
End Sub
先手动创建一个rstj.txt文件,然后在此文件输入一个数字,再在rstj.txt文件的同目录下
创建一个.asp文件,内容如下:
<%
Function rstj()
dim fso,f1,ts,s
Const ForReading=1
Set fso=CreateObject("Scripting.FileSystemObject")
Set ts=fso.OpenTextFile(Server.MapPath("rstj.txt"),ForReading,true,-2)
s=ts.Readline
ts.close
set fso=createobject("scripting.filesystemobject")
set f1=fso.createtextfile(server.mappath("rstj.txt"),true,true)
f1.writeline s+1
f1.close
Set ts=fso.OpenTextFile(Server.MapPath("rstj.txt"),ForReading,true,-2)
s=ts.Readline
rstj=s
ts.close
End Function
%>
您是第<%=rstj%>位访问贵站的朋友
现在很多的公司网站的后台漏洞是大的叫人害怕
只要写入’or’ ’=’,
就可以顺利的登入它的后台管理
针对于此,大家都是如和处理的?
希望各位发出自己的检验,完善下这个帖子,
PS:为安全做点力量
我本着抛砖引玉思想欢迎大家来一起讨论此帖,谢谢!
此帖已经在远望论坛发帖子讨论,已经有人回复总结一文,在此一起发出,希望更多的人针对此发表自己的见解
针对ASP中SQL Injection的初级防护(总结版)
robur/文
记得大约是在2002年的时候,SQL Injection(SQL注入)开始有了最初的雏形。黑客们发现,在动态网页的某些地方(表单等……)插入一些可以在数据库查询中起作用的语句和符号,就可以让页面执行后,返回特殊的结果。于是,经过了2003的发展,到2004年,SQL Injection已经作为一种很成熟的入侵技术登上了安全界的舞台。也是2004年,有大批的网站程序被发现了SQL Injection漏洞,也有大批的网站栽倒在这种攻击手段之下。
下面,我就小行和逍遥一指令的帖子,作总结性的说明,仅供参考。
正如如小行所说的,在某些网站的登录界面,如果你知道了存在的用户名(例如:admin),你无须知道密码。只需在密码框中输入’ or ’’=’即可。(注意,全是单引号!)这样在不知道密码的情况下,也可以用admin的身份登录。
但是,我想说的是,’ or ’’=’在一些地方会出现问题。有些数据库不会认为“空”=“空”是成立的条件,这样就不行了。最好写成’ or ’1’=’1
这样,SQL的查询语句,就变成了如下的样子。
select * from users where name=’admin’ and pass=’123456’ or ’1’=’1’
上面,蓝色的部分是用户在密码框中输入的数据。大家可以看见,由于用户的巧妙构造,使得SQL Server把这条查询语句解析为3个条件:
1、name=’admin’
2、pass=’123456’
3、’1’=’1’
关键是中间的那个or,这样一来,SQL Server在解析的时候,只要条件2、3,符合一个就可以了。
因为1=1是衡成立的,所以这个查询的结果肯定是true。
既然已经知道了原理,那我们可以试着防范这种攻击。
我们的根本目标,就是把用户输入的单引号和or过滤掉,这样就能在基本上杜绝SQL Injection攻击。但是,需要强调的是,SQL语句中,起作用的还有and,分号,–(两个减号)等等。
解释一下:and用于连接两个条件。;(分号)用于分隔两个语句。(如果把两个语句写在一行,就需要它。)–(双减号只在MS SQL Server中起作用,含义是忽略后面的内容。这个通常在繁琐的MS SQL注入中使用。)
回归主题。asp中为我们提供的字符转义函数:Replace。看代码:
<%
Dim Usr,Pwd
Usr=Request.form("username") ’从表单获得数据
Pwd=Request.form("password") ’同上
if (Usr<>"") and (Pwd<>"") then ’判断数据为非空
Usr=Replace(Replace(Usr,"’",""),"or","") ’嵌套了两个replace函数,过滤特殊字符
Pwd=Replace(Replace(Pwd,"’",""),"or","")
end if
%>
Repalce语法规则:
Replace(变量名称,"要过滤的字符","要替换的字符")
说明,“要替换的字符”那里,如果留空,就是把要过滤的字符直接删除。
例子:
Replace(Pwd,"’or","")
过滤Pwd变量中的or字符。
由于Replace函数,一次只能对一组字符进行转义,所以讲讲Replace的嵌套:
Replace(Replace(Pwd,"or",""),"’","")
代码中红色的地方,被外面的replace函数看作一个变量,依此类推。
如果你还想过滤and,分号,–什么的,请看下面(完全过滤了在SQL注入中最关键的5个字符串。)
Replace(Replace(Replace(Replace(Replace(变量名称,"’",""),"or",""),"and",""),"–",""),";","")
上面只是防范从表单提交的数据,对于一些新闻系统,经常会出现诸如:
http://host/news/show.asp?id=1
之类的URL。
如果在那个1后面,加上一个单引号,一样会报错。我们往下看。
如果加上了单引号,SQL语句就变成了:
select * from news where id=’1’’
因为最后一个引号没有闭合,所以系统一定会报错。
防范如下(其实和上面的原理是一样D……)看代码:
<%
Dim id
id=Request("id")
if Not IsNumeric(id) then ’------事先声明了变量,所以可以直接写进去。否则,就要写Request("id")
Response.write "Error!" ’------反馈错误信息
Response.end ’------中止执行下面的语句
end if
%>
因为,类似新闻ID之类的变量,是根本不需要有字母和符号存在的,所以用IsNumeric来判断是否为纯数字,确保万无一失。
如果一个变量,里面需要有字母和符号,那你就只好用Replace函数慢慢过滤了……:O)
最后,再说两种防止ASP页面暴出错误信息的方法。
众所周知,入侵者往往都是通过页面暴出的错误来得知一些额外的信息。比如你的系统,SQL Server的版本,是否存在某数据库,SQL语句是否执行成功等……
防止入侵者看到错误信息,就是让入侵者变成了睁眼瞎,找不到头绪。(骨灰级黑客除外~~~~)
方法1:打开你的IIS管理器(以IIS6.0为例),选择你的网站=》属性页面=》主目录选项卡=》点击配置按钮=》调试选项卡=》向客户端发送下列文本错误消息
这样,即使入侵者找到了注入点,注入后,得到也只是服务器返回的固定的错误消息。不能得到任何有价值的错误信息。
方法2:在你的ASP语句中(一般是在最开头的地方),加上一句
On Error Resume Next
(注意,这句必须加在<% %>里面,不然IIS可不认。)
这就是著名的容错语句,当ASP语句执行时发生错误,就跳过错误,继续向下执行,而且不会返回错误信息。
当然,入侵者看不到错误信息,调试人员也看不到。所以,你一定在把一个ASP程序调试完毕后,再把这个语句加到ASP语句的顶端。否则,调试的时候,会烦死你的~~~~~
这么长的文章是不是有点小题大做了?感觉?
呵
replace(content."'","")就可以了
意思是去掉提交内容的引号
后补:还可以新建个ASP文件,如:sql.asp,然后在login.asp或conn.asp建个包含此文件就行。
sql.asp的代码如下:[code]
<%
Dim Query_Badword,Form_Badword,i,Err_Message,Err_Web,name
'------定义部份 头----------------------------------------------------------------------
Err_Message = 3 '处理方式:1=提示信息,2=转向页面,3=先提示再转向
Err_Web = "http://www.ct268.com/bbs" '出错时转向的页面
Query_Badword="'∥and∥select∥update∥chr∥delete∥%20from∥;∥insert∥mid∥master.∥set∥chr(37)∥="
'在这部份定义get非法参数,使用"∥"号间隔
Form_Badword="'∥(∥)∥;∥=" '在这部份定义post非法参数,使用"∥"号间隔
'------定义部份 尾-----------------------------------------------------------------------
On Error Resume Next
'----- 对 get query 值 的过滤.
if request.QueryString<>"" then
Chk_badword=split(Query_Badword,"∥")
FOR EACH Query_Name IN Request.QueryString
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.QueryString(Query_Name)),Chk_badword(i))<>0 Then
Select Case Err_Message
Case "1"
Response.Write ""
Case "2"
Response.Write ""
Case "3"
Response.Write ""
End Select
Response.End
End If
NEXT
NEXT
End if
'-----对 post 表 单值的过滤.
if request.form<>"" then
Chk_badword=split(Form_Badword,"∥")
FOR EACH name IN Request.Form
for i=0 to ubound(Chk_badword)
If Instr(LCase(request.form(name)),Chk_badword(i))<>0 Then
Select Case Err_Message
Case "1"
Response.Write ""
Case "2"
Response.Write ""
Case "3"
Response.Write ""
End Select
Response.End
End If
NEXT
NEXT
end if
%>
[/code]
打开office老是出现下面的对话框:

去年就出现过这种情况,后来知道是瑞星捣的鬼,只要把瑞星设置“其他设置”中“使用office/IE安全助手”前面的勾取消就能解决问题。其实,这是某些杀毒软件对最新的OFFICE2003支持不好造成的,只是因为在相似的杀毒选项的杂项中,启用了office插件的保护功能,去掉选项,打开word文件时就不会出现对话框(只有安装了OFFICE2003才有此现象)。
可是现在瑞星2006没有该项设置了,除非把瑞星的office/IE嵌入式杀毒去掉,但这样有风险,不敢玩。查阅了microsoft网站,是这样说的:
症状
如果通过双击一个文档(例如,在 Microsoft Windows 资源管理器中)来在 Microsoft Office Word 2003 中打开该文档,则会收到下面的错误信息:The command cannot be performed because a dialog box is open.Click "OK" and then close open dialog boxes to continue.
在 Microsoft Word 2002 中不会收到这一错误信息。
原因
如果 Startup 文件夹中有一个 Word 2003 模板,该模板中包含能打开对话框的自动执行 (autoexec) 宏,则可能发生此问题。
替代方法
方法 1:在 Word 中打开
要在 Word 中直接打开文档,请按下列步骤操作: 1. 启动 Word 2003。
2. 在“文件”菜单上,单击“打开”。
3. 在“打开”对话框中,选择要打开的文档,然后单击“打开”。
方法 2:从 Startup 文件夹中删除模板
要从 Startup 文件夹中删除模板,请按下列步骤操作: 1. 退出 Word 2003。
2. 单击“开始”,指向“程序”,指向“附件”,然后单击“Windows 资源管理器”。
3. 找出下列文件夹之一:
Documents and Settings\username\Application Data\Microsoft\Word\Startup
Program Files\Microsoft Office\Office11\Startup 文件夹
4. 双击以打开“Startup”文件夹。
5. 在 Windows 资源管理器的右窗格中,单击以选择要删除的模板,然后按 Delete 键。
这篇文章中的信息适用于:
• Microsoft Office Word 2003
关键字: kberrmsg kbprb KB827732
第一种方法是可以的,但第二种方法不行,我的startup文件夹里根本就没有东东。
上回在一个论坛看到有人问服务端限制提交数据为16字节能不能写个webshell到改为asp格式的数据库,所以就想了想,发现了这个更小的后门
你一定见过冰狐浪子的asp后门吧,呵呵,他的后门号称“最小的asp后门”,所以偶的这个只好是“更小的”了。
废话少说,先看看他的代码:
javas cript下的eval(Request.form('#')+'')
vbs cript下的<%Execute Request("?")%>
第一个太长不说了;第二个在实际使用中由于execute函数的参数为空时会产生错误必须加上容错或者条件判断句所以会多出很多字节出来。
那天看VBs cript参考手册时发现原来vbs里也有eval函数,其作用是“计算一个表达式的值并返回结果”。看它的描述好像是不会执行代码的。“尽信书不如无书”,所以不管它试试再说。
新建一个asp文件内容为“<%eval("response.write(""lake2"")")%>”,这是调用eval函数但忽略其返回值(实际上这里返回值为空)。执行之,哈哈,response.write语句执行了!原来eval像execute一样可以执行一个或多个指定的语句。但是eval函数参数为空时并不会出错,所以你可以放心的把“<%eval request("X")%>”插入到asp文件中而不必担心破坏原有asp文件的执行。
剩下的事就是用HTML写个客户端,简单得等同于体力活了。不过需要注意提交的代码里的回车换行符用要&vbcrlf&替换掉——eval可是不认回车和冒号分隔符的哦,这也是它与execute的不同之处。
虽然这个后门更小些,不过一般情况下execute已经足够了;这个后门加上asp标识符共有21个字节,不知道是不是asp后门的极限了呢?
[cry][redface]
无奈中,可看着自己的BLOG发来那么多的AD,真是头痛。用在自己的服务器里又动不动出现乱码,通定思痛,还是走转他方……
还好,大LOGO上写了个诗,感动!陆游的~有意思啊!