Asppwdrst.asp代码如下:
<%ifrtrim(request.form(“t1”))=
“mis”and_rtrim(request.form(“t2”))=
“mis”then%>
“标楷体”size=“7”_color=“#0000ff”> 你已成功登录!
<%else%>
“标楷体”size=“7”_color=“#0000ff”> 请输入正确的用户名和密码
<%endif%>
在这个方案里asppwd.asp只提供输入的功能,而名称和密码的确认工作由asppwdrst.asp来做。
这样即使您记住了asppwdrst.asp所在的URL,也看不到具体的内容。
所以用这种方案设计的网页保密系数就很高。
ASP程序密码验证漏洞
这个漏洞其实是很多网站都存在的,特别是提供用ASP编写的聊天室,BBS等(其它的语言我不懂,但我想也会存在这方面的洞的。
)。
一般来说,我们在验证用户是否合法时,会用如下的语句:
setdb=server.CreateObject("ADOdb.recordset")
sqlstr=select*fromtablewhereuser=“"&request("user")&"“andpassword=“"&request("password")&"“"
db.opensqlstr,"DSN=aa;",1然后检测得到的表是否为空,如果为空则用户非法,如果不为空则用户是合法的。
ifdb.eofanddb.bofthen
ok="no"
else
ok="yes"
endif这段程序单从技术角度看规范的,但从安全角度看就存在一个非常大的洞。
因为我们可以构造一个特殊的用户口令和用户名从而进入受保护的系统内部。
user=“aa“oruser<>“aa“
password=“aa“orpassword<>“aa“
相应的在浏览器端的用户名框内写入:
aa“oruser<>“aa
口令框内写入:
aa“orpassword<>“aa,注意这两个字符串两头是没有“的。
这样就可以成功的骗过系统而进入。
理论虽然如此,但要实践是非常困难的,下面两个条件都必须具备。
1.你首先要能够准确的知道系统在表中是用哪两个字段存储用户名和口令的,只有这样你才能准确的构造出这个进攻性的字符串。
实际上这是很难猜中的。
2.系统对你输入的字符串不进行有效性检查。
从这儿可以看出源码泄露的漏洞有时是致命的!
!
我想出的解决办法:
1.就象yexiaolu所说的,分开写,可以看看他的贴子。
2.将存储用户名和用户口令的字段取两个毫不相干的名字,让攻击者猜不中。
3.对用户输入的数据进入有效性检查,如替换掉“等。
4.可以考虑对口令进行简单的加密,如将输入的口令字符串变换一下字符串中字符的位置等都可以有效的防止这种进攻。
5.最重要的一点,不要泄露你的源码!
!
!
!
ACCESS数据库防止下载
怎样防止mdb数据库被下载一直是用access的程序员的一大头疾。
现在总结如下有效方法:
1.修改数据库名。
这是常用方法,将数据库名该成怪异名字或长名字,以防别人猜测。
一旦被人猜到,别人还是能下载数据库文件,但几率不大。
如将数据库database.mdb改成dslfjds$^&ijjkgf.mdb等
2.修改数据库后缀。
一般改成database.asp、database.asa、database.inc、database.cgi、database.dll等等,注意要在IIS中设置这些后缀的文件不能被解析。
3.将数据库database.mdb改成#database.mdb。
这是最简单有效的办法。
分析:
假设别人得到你的数据库地址串将是:
但实际上他得到是:
因为#在这里起到间断符的作用,地址串遇到#号,自动认为访问地址串结束。
注意:
不要设置目录可访问。
用这种方法,不管别人用何种工具都无法下载,如flashget,网络蚂蚁等。
注:
只要数据库文件名任何地方含有'#',别人都无法正常下载。
同理,空格号也可以起到'#'号作用,但必须是文件名中间出现空格。
4.将数据库连接文件放到其他虚拟目录下。
5.将Access数据库加密。
以上只列出常用之法,为增加保险性,可以几种方法同时使用。
压缩并修复Access数据库
CompactandRepair
Youcanusethe"CompactandRepair"functioninAccessfromASPcode.Thefollowingcodeisanexampleof
howthiscanbedone.Notethatwhenyoudecideto"CompactandRepair"yourAccessdatabase,some
autonumberscanbechanged.Accessmakesallautonumbersconsecutive.
Thiscodeusesonedatabase,butI'msurethecodecaneasilybechangedsothatthelistboxdisplays,for
example,allthedatabasesinonefolder.
<%
ConstJet_Conn_Partial="Provider=Microsoft.Jet.OLEDB.4.0;Datasource="
DimstrDatabase,strFolder,strFileName
'#################################################
'#Editthefollowingtwolines
'#Definethefullpathtowhereyourdatabaseis
strFolder="F:
\InetPub\wwwroot\_db\"
'#Enterthenameofthedatabase
strDatabase="YourAccessDatabase.mdb"
'#Stopeditinghere
'##################################################
PrivateSubdbCompact(strDBFileName)
DimSourceConn
DimDestConn
DimoJetEngine
DimoFSO
SourceConn=Jet_Conn_Partial&strFolder&strDatabase
DestConn=Jet_Conn_Partial&strFolder&"Temp"&strDatabase
SetoFSO=Server.CreateObject("Scripting.FileSystemObject")
SetoJetEngine=Server.CreateObject("JRO.JetEngine")
WithoFSO
IfNot.FileExists(strFolder&strDatabase)Then
Response.Write("NotFound:
"&strFolder&strDatabase)
Stop
Else
If.FileExists(strFolder&"Temp"&strDatabase)Then
Response.Write("Somethingwentwronglasttime"_
&"Deletingolddatabase...Pleasetryagain")
.DeleteFile(strFolder&"Temp"&strDatabase)
EndIf
EndIf
EndWith
WithoJetEngine
.CompactDatabaseSourceConn,DestConn
EndWith
oFSO.DeleteFilestrFolder&strDatabase
oFSO.MoveFilestrFolder&"Temp"_
&strDatabase,strFolder&strDatabase
SetoFSO=Nothing
SetoJetEngine=Nothing
EndSub
PrivateSubdbList()
DimoFolders
SetoFolders=Server.CreateObject("Scripting.FileSystemObject")
Response.Write("
ForEachItemInoFolders.GetFolder(strFolder).Files
IfLCase(Right(Item,4))=".mdb"Then
Response.Write(" &""">"&Replace(Item,strFolder,"")&"") EndIf Next Response.Write("") SetoFolders=Nothing EndSub %> <% 'Compactdatabaseandtelltheuserthedatabaseisoptimized SelectCaseRequest.form("cmd") Case"Compact" dbCompactRequest.form("DBFileName") Response.Write("Database"&Request.form("DBFileName")&"isoptimized.") EndSelect %>
<%dbList%>
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1