2023年11月23日发(作者:)

asp⽹站安全--如何防⽌ACCESS数据库被下载

⽂件改名为⽂件后放在wwwroot⽬录⾥。然后在IE中输⼊路径后,发现IE显⽰⼀⽚空⽩,

右键->察看源⽂件,跳出记事本,将内容另存为.mdb⽂件,⽤ACCESS打开,发现需要密码,也就是说⾄少⽂件头被破坏。

然后⽤Flashget试验下载⽂件,并另存为⽂件,发现⽤ACCESS打开完好⽆损!看来,好⼀些编程⼈

员在开发的时候都认为,改了mdb后缀为asp就能防下载的概念,是错的!后台数据库被下载对于⼀个asp+access的⽹站来

说⽆疑是⼀场惨绝⼈寰的灾难。今天找了各⽅的⽂章,归纳⼀下有以下9种办法防⽌数据库被下载(欢迎补充)

1.发挥你的想象⼒修改数据库⽂件名

不⽤说,这是最最偷懒的⽅法,但是若攻击者通过第三⽅途径获得了数据库的路径,就玩完了。⽐如说攻击者本来只

能拿到list权,结果意外看到了数据库路径,就可以冠冕堂皇地把数据库下载回去研究了。另外,数据⽂件通常⼤⼩都⽐

较⼤,起再隐蔽的⽂件名都瞒不了⼈。故保密性为最低。

2.数据库名后缀改为ASAASP

此法须配合⼀些要进⾏⼀些设置,否则就会出现本⽂开头的那种情况。

(1)⼆进制字段添加。

(2)在这个⽂件中加⼊,IIS就会按ASP语法来解析,然后就会报告500错误,⾃然不能下载了。可是如果只是简单的在

数据库的⽂本或者备注字段加⼊<%是没⽤的,因为ACCESS会对其中的内容进⾏处理,在数据库⾥他会以<%的形式存在,⽆

效!正确的⽅法是将<%存⼊OLE对象字段⾥,这样我们的⽬的就能达到了。

操作⽅法:

⾸先,⽤notepad新建⼀个内容为<%的⽂本⽂件,随便起个名字存档。

接着,⽤Access打开您的数据库⽂件,新建⼀个表,随便起个名字,在表中添加⼀个OLE对象的字段,然后添加⼀个记

录,插⼊之前建⽴的⽂本⽂件,如果操作正确的话,应该可以看到⼀个新的名为"数据包"的记录。即可。

3.数据库名前加"#"

只需要把数据库⽂件前名加上#、然后修改数据库连接⽂件(如)中的数据库地址。原理是下载的时候只能识

#号前名的部分,对于后⾯的⾃动去掉,⽐如你要下载:(假设存在的话)。⽆

论是IE还是FLASHGET等下到的都是、等你在IIS设置的⾸页

⽂档)

另外在数据库⽂件名中保留⼀些空格也起到类似作⽤,由于HTTP协议对地址解析的特殊性,空格会被编码为"%",

,下载的时。⽽我们的⽬录就根本没有

123%这个⽂件,所以下载也是⽆效的这样的修改后,即使你暴露了数据库地址,⼀般情况下别⼈也是⽆法下载!

4.加密数据库 中国..长站

⾸先在选取"⼯具->安全->加密/解密数据库,选取数据库(如:),然后接确定,接着会出现"数据库加

密后另存为"的窗⼝,存为:。接着就会被编码,然后存为..要注意的是,以上

的动作并不是对数据库设置密码,⽽只是对数据库⽂件加以编码,⽬的是为了防⽌他⼈使⽤别的⼯具来查看数据库⽂件的

内容。

接下来我们为数据库加密,⾸先以打开经过编码了的,在打开时,选择"独占"⽅式。然后选取功能表的

"⼯具->安全->设置数据库密码",接着输⼊密码即可。这样即使他⼈得到了⽂件,没有密码他是⽆法看到

的。

加密后要修改数据库连接页,如:

"driver={ microsoft access driver&nb sp;

(*.mdb) };uid=admin;pwd=数据库密码;dbq=数据库路径"

这样修改后,数据库即使被⼈下载了,别⼈也⽆法打开(前提是你的数据库连接页中的密码没有被泄露)。

但值得注意的是,由于Access数据库的加密机制⽐较简单,即使设置了密码,解密也很容易。该数据库系统通过将⽤

户输⼊的密码与某⼀固定密钥进⾏"异或"来形成⼀个加密串,并将其存储在*.mdb⽂件从地址"&H42"开始的区域内。所以⼀

个好的程序员可以轻松制作⼀个⼏⼗⾏的⼩程序就可以轻松地获得任何Access数据库的密码。因此,只要数据库被下载,

其信息安全依然是个未知数。

5.数据库放在WEB⽬录外或将数据库连接⽂件放到其他虚拟⽬录下

如你的WEB⽬录是e:webroot,可以把数据库放到e:data这个⽂件夹⾥,在e:webroot⾥的数据库连接页中修改数据

库连接地址为:"../data/数据库名"的形式,这样数据库可以正常调⽤,但是⽆法下载的,因为它不在WEB⽬录⾥!这个⽅

法⼀般也不适合购买虚拟空间的⽤户。

6.使⽤ODBC数据源

ASP等程序设计中,如果有条件,应尽量使⽤ODBC数据源,不要把数据库名写在程序中,否则,数据库名将随ASP

代码的失密⽽⼀同失密,例如:

DBPath = h("../123/ abc/ ")

"driver={ Microsoft Access Driver&nb sp;(*.mdb) };dbq="& DBPath

可见,即使数据库名字起得再怪异,隐藏的⽬录再深,ASP源代码失密后,也很容易被下载下来。如果使⽤ODBC数据源

,就不会存在这样的问题了: "ODBC-DSN",不过这样是⽐较烦的,⽬录移动的话⼜要重新设置数据源了,更

⽅便的⽅法请看第78法!

7.添加数据库名的如MDB的扩展映射

这个⽅法就是通过修改IIS设置来实现,适合有IIS控制权的朋友,不适合购买虚拟主机⽤户(除⾮管理员已经设置了)

。这个⽅法我认为是⽬前最好的。只要修改⼀处,整个站点的数据库都可以防⽌被下载。⽆须修改代码即使暴露⽬标地址

也可以防⽌下载。

我们在IIS属性---主⽬录---配置---映射---应⽤程序扩展那⾥添加.mdb⽂件的应⽤解析。注意这⾥的选择的DLL(或

EXE等)似乎也不是任意的,选择不当,这个MDB⽂件还是可以被下载的,注意最好不要选择选择等。你可以⾃⼰多

测试下,修改后下载数据库,就出现(404500等错误)。

8.使⽤.net的优越性

动⽹的⽊鸟就写过⼀个防⾮法下载⽂件的"WBAL防盗链⼯具"

不过那个只实现了防⽌⾮本地下载的,没有起到真正的防下载数据库的功能。不过这个⽅法已经跟5法差不多可以通过

修改.NET⽂件,实现本地也不能下载!

这⼏个⽅法中,只有第78个是统⼀性改的,⼀次修改配置后,整个站点的数据库都可以防⽌下载,其他⼏个就要分

别修改数据库名和连接⽂件,⽐较⿇烦,不过对于虚拟主机的朋友也只能这样了!

其实第6个⽅法应该是第5个⽅法的扩展,可以实现特殊的功能,但对于不⽀持.net的主机或者怕设置⿇烦的话,还是

直接⽤第5个⽅法了,⽽且默认情况下第6个⽅法,依然可以通过复制连接到同主机的论坛或留⾔本发表,然后就可以点击

下载了。(因为这样的引⽤页是来⾃同主机的)

9.利⽤NTFS分区的⽂件权限设置(bypercyboy)

我们已经知道,中使⽤访问数据库,通过OleDb的连接可以访问Access数据库——我们⾮常常⽤的低端

数据库之⼀。本⽂讨论了中可能看到的若⼲错误提⽰,从中看到Access2000AccessXP创建的数据库⽂件,在访问

出现错误时会出现不太相同的错误提⽰。希望对⼤家有所帮助。另⼀个要点是,希望通过此⽂,使⼤家对Access

数据库⽂件的NTFS权限设置有所新的认识。

()实验过程

为了叙述⽅便,举个具体例⼦做个实验:应⽤程序为/test,数据库存放在D:,我们已经

知道在中是以⼀个叫做ASPNET虚拟⽤户的⾝份访问数据库的,我们需要给这个账户以特定的NTFS权限才能使

程序正常运⾏。

为了得到最严格的NTFS权限设置,实验开始时我们给程序最低的NTFS权限:

a)D:wwwroottestdata⽂件夹的给⽤户ASPNET以如下权限:

允许 拒绝

完全控制 &n bsp;

修改 &nbs p; &nbs p;

读取及运⾏ ;

列出⽂件夹⽬录 ; √

读取 &nbs p; &nbs p;√

写⼊ &nbs p; &nbs p;

b) D:⽂件本⾝给⽤户ASPNET以如下权限:

允许将来⾃⽗系的可继承权限传播给该对象

1.1对于某个只包含有"SELECT"命令的aspx程序,上述权限设置运⾏时⽆障碍,即:上述权限已经满⾜这类程序的运⾏

了。

1.2对于包含有"UPDATE""INSERT""UPDATE"等命令的aspx程序。

(a)如果Access2000创建的数据库,出现如下错误:

"/test"应⽤程序中的服务器错误。

MicrosoftJet数据库引擎打不开⽂件'D:wwwroottestdata' 它已经被别的⽤户以独占⽅式打开,或没有查看数

据的权限。

说明:执⾏当前Web请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出

处的详细信息。

异常详细信息:xception:MicrosoftJet数据库引擎打不开⽂件'D:wwwroottestdata'

它已经被别的⽤户以独占⽅式打开,或没有查看数据的权限。

(b)如果AccessXP创建的数据库,出现如下错误: "/test"应⽤程序中的服务器错误。

操作必须使⽤⼀个可更新的查询。

说明:执⾏当前Web请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出

处的详细信息。

异常详细信息:xception:操作必须使⽤⼀个可更新的查询。

(c)原因初步分析:因为包含有"UPDATE""INSERT""UPDATE"等命令,需要对数据库⽂件本⾝进⾏写⼊操作,所以上述权

限不能满⾜此需求,我们需要进⼀步放开权限。

我们放开⼀些权限,

a) D:wwwroottestdata ⽂件夹不变;

b) D: ⽂件本⾝给⽤户ASPNET以如下权限;

允许 拒绝

完全控制 &n bsp;

修改 &nbs p; &nbs p;

读取及运⾏ ;

列出⽂件夹⽬录 ; √

读取 &nbs p; &nbs p;√

写⼊ &nbs p; &nbs p;√

1.3 放开权限后继续实验

(a)如果Access2000创建的数据库,出现如下错误: "/test"应⽤程序中的服务器错误。

不能锁定⽂件。

说明:执⾏当前Web请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出

处的详细信息。

异常详细信息:xception:不能锁定⽂件。

(b)如果AccessXP创建的数据库,没有出现错误。

(c)原因初步分析:我们发现在打开Access数据库时,同时会在所在⽬录⽣成⼀个同名的*.ldb⽂件,这是⼀个Access

的锁定标记。鉴于此,我们猜测,⽤户ASPNET访问Access数据库时,也需要⽣成⼀个锁定标记,⽽该⽬录没有允许其写⼊

,因此出错。⾄于AccessXP创建的数据库为什么没有这个错误,原因还不得⽽知。

我们进⼀步放开权限,

a)D:wwwroottestdata⽂件夹给⽤户ASPNET以如下权限:

允许 拒绝

完全控制 &n bsp;

修改 &nbs p; &nbs p;

读取及运⾏ ;

列出⽂件夹⽬录 ; √

读取 &nbs p; &nbs p;√

写⼊ &nbs p; &nbs p;√

b) D:⽂件本⾝给⽤户ASPNET以如下权限:

允许将来⾃⽗系的可继承权限传播给该对象

1.4继续实验,发现错误已解决,那么上⾯这个权限就是我们需要放开的"最低权限"

(a)如果Access2000创建的数据库,我们会发现⼀个⼩问题:⽣成的*.ldb⽂件不会⾃⼰删除,访问后该⽂件

依然存在,但这个问题不会影响的正常运⾏。

(b)如果AccessXP创建的数据库,没有出现上⾯类似问题。

(c)原因初步分析:我们仅仅是给了ASPNET以写⼊⽂件夹的权限,没有给它修改的权限,所以⽂件⼀旦写⼊,便⽆法修

改其内容,*.ldb也就删除不掉了。

如果⾮要解决这个问题,进⼀步放开权限为:

a)D:wwwroottestdata⽂件夹给⽤户ASPNET以如下权限:

允许 拒绝

完全控制 &n bsp;

修改 &nbs p; &nbs p;√

读取及运⾏ ;

列出⽂件夹⽬录 ; √

读取 &nbs p; &nbs p;√

写⼊ &nbs p; &nbs p;√

b) D: ⽂件本⾝给⽤户ASPNET以如下权限:

允许将来⾃⽗系的可继承权限传播给该对象

1.5附带着,实验另⼀种情形:我们把Access打开编辑,同时访问

(a)如果Access2000创建的数据库,我们发现并没有出现什么问题。

(b)如果AccessXP创建的数据库,出现如下错误:&nb

(t003)