一个网站的安全成功与否很大程序上取决于你的数据库是否安全,如果你的数据库被下载的话,哪么基本上你的这个网站就是别人的了。网上有很多关于这方面信息,我游览了一些网页结合我自己的一些体会,简单说说我的看法。
谈数据库的安全首先要看你是虚拟主机的用户还是自己拥有独立的服务器,如果是虚拟主机用户哪么在程序上来防治下载要多想点办法,如果你的服务器呢,可能在权限设置上设置更有效方便。
这几篇文章总和起来差不多可以了解一个防治access数据库防治下载的基本知识了。
1,几个简单的防治下载和解决办法。把数据库名设置为#data.mdb,只要把#替换为%23就可以解决;把用户名设置为%55data.mdb,把%55替换为%25即可;也有牛逼的把数据库设置成2wegodb%^&(bfjk&^%980995646563&^%$sdfda.mdb,这个难弄些,如果只是知道路径可能难下载,那篇文章的作者是备份重命名的方法下载下来的。
2,把数据库的扩展名修改为asp。如果你仅仅是把mdb数据库扩展名修改为asp,那是没有丝毫作用的,照样被下载。如果我在数据库中写入没有闭合的asp代码,因为asp程序是在服务器执行的,那么asp程序就会出错,数据库自然就无法下载了。这个最基本的方法就是在数据中写入二进制的<%,这个方法一般是在数据库中建立一个表notdownload,添加一个notdown字段,写入<%,哪么这个最基本防御方法就出来了。摘抄子网上的代码:
<% db="access.mdb" '你自己数据库的地址 set conn=server.createobject("Adodb.Connection") connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db) conn.open connstr conn.execute("create table notdownload(notdown oleobject)") '添加notdownload表 set rs=server.createobject("adodb.recordset") sql="select * from notdownload" rs.open sql,conn,1,3 rs.addnew rs("notdown").appendchunk(chrB(asc("<")) & chrB(asc("%"))) '写入<%数据 rs.update rs.close set rs=nothing conn.close '关闭连接 set conn=nothing %>
这段代码就是执行上面说的方法,appendchunk的作用就是将数据追加到二进制数据Field里面。但是如果我在这个数据库中写入asp闭合符号%>不是就不会出错了吗?这样就出来了更深一层的防御。比如如果我加入这样的代码<% loop <% ,loop是跳出循环的命令,如果我在数据库的不同位置插入无数个这样的代码,那么你想要完全闭合asp,那么将是难上加难,这也许是现在为止从程序中来防治数据库被下载最成功的方法了。上面我列举的最后一篇文章就是探讨怎么突破这种防御的,只能说思路是正确的,但是想成功那是彗星撞地球的几率。从上面的分析,那么我们现在可以对上面的代码进行一下改进。就以notdown.asp为例。
<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>防御access数据库被下载</title> </head> <body> <% db="test.asp" set conn=server.createobject("Adodb.Connection") connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath(db) conn.open connstr conn.execute("create table notdownload(notdown oleobject)") set rs=server.createobject("adodb.recordset") sql="select * from notdownload" rs.open sql,conn,1,3 rs.addnew rs("notdown").appendchunk(chrB(asc("<")) & chrB(asc("%")) &chrB(asc("loop")) &chrB(asc("<")) & chrB(asc("%")) &chrB(asc("loop"))) '这里自由发挥了 rs.update rs.close set rs=nothing conn.close set conn=nothing response.write "防御access数据库被下载成功!" %> </body> </html>
把上面的代码保存为notdown.asp,和数据库放在同一个文件夹,或者自己调整数据库的位置,然后在服务器端执行一次,执行后就把它删掉以免泄露数据库位置,那么你的这个防御基本上就生效了。
3,上面都说的基本上是虚拟主机用户的策略,如果拥有服务器的话,那么我们可以从权限设置上面来防治数据库的下载。最基本的方法是首先取消数据库或者所在文件夹的”读取“权限,那么即使知道了路径也无法下载下来,同时在文件系统给予“internet来宾用户”读写的权限维持网站的运行。
还有就是把数据库文件放到WEB目录外,但是我一直没明白这个conn.asp里面的路径该怎么写,用物理路径?还是../就可以?
再有的办法就是添加数据库扩展名的映射和ODBC数据源,这些都是很有效的防治下载的办法。
另外我还可以在urlscan中设置,比如我的数据库文件是data.mdb,那么我在urlscan中设置UseAllowExtensions=0 同时把.mdb加入到[DenyExtensions]中,这样就可以防治mdb被下载了。但是如果我使用脚本把数据库备份重命名呢?把数据库copy到有读取权限的目录是不是就可以下载了呢?那么我禁止copy命令的使用........
环环相扣,无尽循环,又有谁能保证你没有松懈的时候,所以我相信没有攻克不了的服务器,一切都只是时间的问题。或许那一天微软出来一个漏洞,稍加修改,任何用户都可通过explorer被远程执行命令,这不是没有可能!
写到这里,突然觉得在此印证了我自己的观点:攻防无绝对,技术无黑白.