友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
asp基础入门篇(DOC格式)-第9部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
所有的 Recordset 对象都支持 Move 方法,如果 NumRecords 参数大于零,当前记录位置向末尾的方向移动;如果其小于零,则当前记录位置向开头的方向移动;如果一个空的 Recordset 对象调用 Move 方法,将会产生一个错误。
MoveFirst 方法:将当前记录位置移至第一笔记录。
MoveLast 方法:将当前记录位置移至最后一笔记录。
MoveNext 方法:将当前记录位置移至下一笔记录。 MovePrevious 方法:将当前记录位置移至上一笔记录。
Move 'n' 方法:移动指标到第 n 笔记录, n 由 0 算起。
三、 AbsolutePage 属性
AbsolutePage 属性设定当前记录的位置是位于哪一页的页数编号;使用 PageSize 属性将 Recordset 对象分割为逻辑上的页数,每一页的记录数为 PageSize( 除了最后一页可能会有少于 PageSize 的记录数 )。这里必须注意并不是所有的数据提供者都支持此项属性,因此使用时要小心。
与 AbsolutePosition 属性相同, AbsolutePage 属性是以 1 为起始的,若当前记录为 Recordset 的第一行记录, AbsolutePage 为 1。可以设定 AbsolutePage 属性,以移动到一个指定页的第一行记录位置。
四、 AbsolutePosition 属性
若您需要确定目前指标在 RecordSet 中的位置,您可以用 AbsolutePosition 属性。
AbsolutePosition 属性的数值为目前指标相对於第一笔的位置,由 1 算起,即第一笔的 AbsolutePosition 为 1。
注意 ; 在存取 RecordSet 时,无法保证 RecordSet 每次都以同样的顺序出现。
若要启用 AbsolutePosition,必须先设定为使用用户端 cursor( 指针 ), asp 码如下:
rs2。CursorLocation = 3
五、 PageCount 属性
使用 PageCount 属性,决定 Recordset 对象包括多少〃页〃的数据。这里的〃页〃是数据记录的集合,大小等于 PageSize 属性的设定,即使最后一页的记录数比 PageSize 的值少,最后一页也算是 PageCount 的一页。必须注意也并不是所有的数据提供者都支持此项属性。
六、 PageSize 属性
PageSize 属性是决定 ADO 存取数据库时如何分页显示的关键,使用它就可以决定多少记录组成一个逻辑上的〃一页〃。设定并建立一个页的大小,从而允许使用 AbsolutePage 属性移到其它逻辑页的第一条记录。 PageSize 属性能随时被设定。
七、 RecordCount 属性
这也是一个非常常用和重要的属性,我们常用 RecordCount 属性来找出一个 Recordset 对象包括多少条记录。如: 《 % totle=RS。RecordCount %》
在了解了 Recordset 对象的以上属性和方法后,我们来考虑一下,如何运用它们来达到我们分页显示的目的。首先,我们可以为 PageSize 属性设置一个值,从而指定从记录组中取出的构成一个页的行数;然后通过 RecordCount 属性来确定记录的总数;再用记录总数除以 PageSize 就可得到所显示的页面总数;最后通过 AbsolutePage 属性就能完成对指定页的访问。好象很并不复杂呀,下面让我们来看看程序该如何实现呢?
我们建立这样一个简单的 BBS 应用程序,它的数据库中分别有以下五个字段:〃ID〃,每个帖子的自动编号;〃subject〃,每个帖子的主题;〃name〃,加帖用户的姓名; 〃email〃,用户的电子邮件地址;〃postdate〃,加帖的时间。数据库的 DSN 为〃bbs〃。我们将显示帖子分页的所有步骤放在一个名为〃ShowList()〃的过程中,方便调用。程序如下:
'…………BBS 显示帖子分页…………
《 % Sub ShowList() %》
《 %
PgSz=20 '设定开关,指定每一页所显示的帖子数目,默认为20帖一页
Set Conn = Server。CreateObject(〃ADODB。Connection〃)
Set RS = Server。CreateObject(〃ADODB。RecordSet〃)
sql = 〃SELECT * FROM message order by ID DESC〃
'查询所有帖子,并按帖子的ID倒序排列
Conn。Open 〃bbs〃
RS。open sql;Conn;1;1
If RS。RecordCount=0 then
response。write 〃《 P》《 center》对不起,数据库中没有相关信息!《 /center》《 /P》〃
else
RS。PageSize = Cint(PgSz) '设定PageSize属性的值
Total=INT(RS。recordcount / PgSz * …1)*…1 '计算可显示页面的总数
PageNo=Request(〃pageno〃)
if PageNo=〃〃 Then
PageNo = 1
else
PageNo=PageNo+1
PageNo=PageNo…1
end if
ScrollAction = Request(〃ScrollAction〃)
if ScrollAction = 〃 上一页 〃 Then
PageNo=PageNo…1
end if
if ScrollAction = 〃 下一页 〃 Then
PageNo=PageNo+1
end if
if PageNo 《 1 Then
PageNo = 1
end if
n=1
RS。AbsolutePage = PageNo
Response。Write 〃《 CENTER》〃
position=RS。PageSize*PageNo
pagebegin=position…RS。PageSize+1
if position 《 RS。RecordCount then
pagend=position
else
pagend= RS。RecordCount
end if
Response。Write 〃《 P》《 font color='Navy'》《 B》数据库查询结果:《 /B》〃
Response。Write 〃(共有〃&RS。RecordCount &〃条符合条件的信息;显示〃&pagebegin&〃…〃&pagend&〃)《 /font》《 /p》〃
Response。Write 〃《 TABLE WIDTH=600 BORDER=1 CELLPADDING=4 CELLSPACING=0 BGCOLOR=#FFFFFF》〃
Response。Write 〃《 TR BGCOLOR=#5FB5E2》《 FONT SIZE=2》《 TD》《 B》主题《 /B》《 /TD》《 TD》《 B》用户《 /B》《 /TD》《 TD》《 B》Email《 /B》《 /TD》《 TD》《 B》发布日期《 /B》《 /TD》《 /FONT》《 TR BGCOLOR=#FFFFFF》〃
Do while not (RS is nothing)
RowCount = RS。PageSize
Do While Not RS。EOF and rowcount 》0
If n=1 then
Response。Write 〃《 TR BGCOLOR=#FFFFFF》〃
ELSE
Response。Write 〃《 TR BGCOLOR=#EEEEEE》〃
End If
n=1…n %》
《 TD》《 span style=〃font…size:9pt〃》《 A href='view。asp?key=《 % =RS(〃ID〃)%》'》《 % =RS(〃subject〃)%》《 /A》《 /span》《 /td》
《 TD》《 span style=〃font…size:9pt〃》《 % =RS(〃name〃)%》《 /A》《 /span》《 /td》
《 TD》《 span style=〃font…size:9pt〃》《 a href=〃mailto:《 % =RS(〃email〃)%》〃》《 % =RS(〃email〃)%》《 /a》《 /span》《 /TD》
《 TD》《 span style=〃font…size:9pt〃》《 % =RS(〃postdate〃)%》《 /span》《 /td》
《 /TR》
《 %
RowCount = RowCount 1
RS。MoveNext
Loop
set RS = RS。NextRecordSet
Loop
Conn。Close
set rs = nothing
set Conn = nothing
%》
《 /TABLE》
《 FORM METHOD=GET ACTION=〃list。asp〃》
《 INPUT TYPE=〃HIDDEN〃 NAME=〃pageno〃 VALUE=〃《 % =PageNo %》〃》
《 %
if PageNo 》1 Then
response。write 〃《 INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE=' 上一页 '》〃
end if
if RowCount = 0 and PageNo 《 》Total then
response。write 〃《 INPUT TYPE=SUBMIT NAME='ScrollAction' VALUE=' 下一页 '》〃
end if
response。write 〃《 /FORM》〃
End if
%》
《 % End Sub %》
相信大家都应该能完全读懂上面的程序,因此作者就不在此详细解释了。值得注意的是在这段程序中运用了一个小技巧
《 INPUT TYPE=〃HIDDEN〃 NAME=〃pageno〃 VALUE=〃《 % =PageNo %》〃》
,这是用来在每次调用该 ASP 文件时传递数据的〃暗道〃,由于我们需要在每次调用程序时传递代表当前页码的参数,可能大家会想到使用 session,但是从节省系统资源和通用性来讲,用这样一个隐藏的 form 来传递数据将会达到更好的效果。
好了,又到了说再见的时候了,如果你没完全看懂本篇中所列的程序,那你必须加把油,看一看 VbScript 的语法;如果你还有某些疑问,可以〃妹儿〃我,我将尽力解答;如果你有什么更好的建议也千万要来信告诉我哦 :)
ASP基础教程:堵住ASP漏洞
无论你相不相信,通过 asp,可能可以很方便地入侵 web server、窃取服务器上的文件、捕获 web 数据库等系统的用户口令,甚至恶意删除服务器上的的文件,直至造成系统损坏,这些都决非耸人听闻,而且都确确实实发生过,本文将向你一一揭示这些 asp 存在的漏洞,并提出一些防范意见。
上一篇中给大家着重谈了〃ADO 存取数据库时如何分页显示〃的问题,有位朋友来信给我指出我在计算页面总数时忽略了 Recordset 对象的一个重要参数〃PageCount〃,它能在给 Pagesize 赋值后自动得出页面的总数,而无须用〃INT(RS。recordcount/PgSz*…1)*…1〃这样繁琐的公式。我要感谢这位朋友热心地给我指出程序中的不足,由于这个程序是我在很久以前写的,因为在分页显示的时候记录的总数不一定能整除页面显示记录的数目,而当时我又不能肯定 PageCount 是否能正确得出页面的数目,所以偷懒写了这个公式:),说实话我到现在还都没试过用 pagecount,有兴趣的朋友千万要试一下哦,可别学我的懒惰呀。
最近我在 chinaasp 的 bbs 上讨论问题时发现很多朋友对于 asp 的一些安全性问题不甚了解,甚至不知道如何解决最常见的 asp::DATA 显示源代码的问题,因此我觉得非常有必要在这里给广大朋友们重点谈一谈这个问题,在征得 chinaasp 飞鸟的同意下,我将他曾经写过的一点关于 asp 漏洞的介绍加上我自己的一些实践经验拿出来给大家详细分析一下这个对于 webmaster 来说至关重要的 asp 的安全性问题。
当去年 ::DATA 的漏洞被发现并公布的第二天,我曾经检测了当时国内大部分运用 asp 的站点,其中百分之九十九都存在以上可以看见源代码的问题,当日我甚至在微软的站点上抓下了 search。asp 这个文件的源代码。可能你会觉得看到源代码并没有什么大碍,如果作为 webmaster 的你这么想就大错特错了。譬如,如果 asp 程序员将站点的登陆密码直接写在 asp 里,那么一旦源码被发现,他人就可以很容易的进入本不该被看到的页面,我就曾经利用这个方法免费成为了一个收费网站的成员(大家可别揭发我哦!),而且很多数据库的连接用户名和密码也都是直接写在 asp 里,一旦被发现,如果你的数据库允许远程访问而且没有设防的话就相当危险了。在一些用 asp 开发的 bbs 程序中,往往使用的是 access mdb 库,如果 mdb 库存放的路径被获知,数据库就很有可能被他人下载,加之如果数据库里含有的密码不加密,那就非常危险了,获取密码的人如果有意进行恶意破坏,他只需要以 admin 身份登陆删除所有 bbs 里的帖子,就够你呛的了。下面列出了目前已经发现的一些漏洞,希望大家提高警惕一、经过实验我们发现, win95+pws 上运行 ASP 程序,只须简单地在浏览器地址栏的 asp 文件名后多加一个小数点 ASP 程序就会被下载下来。 IIS3 也存在同样的问题,如果你目前还在使用 IIS3 一定要测试一下。
二、 iis2、 iis3、 iis4 的一个广为人知的漏洞就是 ::DATA,通过它使用 ie 的 view source 或 netscape 直接访问该 asp 文件就能轻而易举地看到 asp 代码。 win98+pws4 不存在这个漏洞。
究竟是什么原因造成了这种可怕的漏洞呢?究其根源其实是 Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统: NTFS,这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制,但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道, NTFS 支持包含在一个文件中的多数据流,而这个包含了所有内容的主数据流被称之为〃DATA〃,因此使得在浏览器里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而直接导致 ::DATA 的原因是由于 IIS 在解析文件名的时候出了问题,它没有很好地规范文件名。
我们该如何解决这个问题呢?办法有几种:
a、是将 。asp 文件存放的目录设置为不可读(ASP 仍能执行),这样 html、 css 等文件就不能放在这个目录下,否则它们将不能被浏览。
b、是安装微软提供的补丁程序,下载的地址如下(注意针对不同的系统有不同的补丁):
该补丁是针对 IIS3, Intel 平台
ftp。microsoft。/bussys/iis/iis…public/fixes/cht/security/iis3…datafix/iis3fixi。exe
该补丁是针对 IIS3, Intel 平台
ftp。microsoft。/bussys/iis/iis…public/fixes/cht/security/iis3…datafix/iis3fixa。exe
该补丁是针对 IIS4, Alpha 平台
ftp。microsoft。/bussys/iis/iis…public/fixes/cht/security/iis4…datafix/iis4fixi。exe
该补丁是针对 IIS4, Alpha 平台
ftp。microsoft。/bussys/iis/iis…public/fixes/cht/security/iis4…datafix/iis4fixa。exe
c、是在服务器上安装 ie4。01sp1,这个是否有效,作者本人没具体试过。
d、存粹作者的个人意见,尽量安装英文版的 NT,而不要使用中文版,究其原因作者也说不清,只是根据实践经验英文版的 NT 较中文版 bug 少,如果哪位朋友知道原因千万要告诉我。
三 。 支持 ASP 的免费主页空间以及虚拟主机服务的服务器面临的问题
1、服务器上的 ASP 代码很可能被人其他拥有 asp 权限的人非法获取。
举个很简单的例子,在微软提供的 ASP1。0 的例程里有一个 。asp 文件专门用来查看其它 。asp 文件的源代码,该文件为 ASPSamp/Samples/code。asp。如果有人把这个程序上传的服务器,而服务器端没有任何防范措施的话,他就可以很容易地查看他人的程序。
例如 :
code。asp?source=/directory/file。asp
2、使用的 ACCESS mdb 数据库可能被人下载一般来说在提供 asp 权限的免费主页服务器上不可能提供代为设定 DSN 的服务,因此 asp 程序使用的数据库通常都局限在使用 mdb 库,而 mdb 远端数据库所在的位置是使用我们在第十四期中讲到过的 DSN…less 方法直接在 asp 中指定的,方法如下 :
《 %connstr = 〃DBQ=〃+server。mappath(〃database/source。mdb〃)+〃;DefaultDir=;DRIVER={Microsoft Access Driver (*。mdb)};DriverId=25;FIL=MS Access;ImplicitmitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5; SafeTransactions=0;Threads=3;UsermitSync=Yes;〃%》
正如前文所言,在这种情况下 mdb 库很可能被他人下载,从而造成诸如密码等的泄露。
所以,作为 webmaster 应该采取一定的措施,严禁 code。asp 之类的程序(似乎很难办到 ; 但可以定期检索特征代码),限制 mdb 的下载。
3、来自强大的 filesystemobject 组件的威胁
IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现,包括文本文件的读写目录操作、文件的拷贝改名删除等,但是这个强大的功能也留下了非常危险的〃后门〃。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区,如果权限没有设定好的话,同样也能破坏,一不小心你就可能遭受〃灭顶之灾〃。遗憾的是很多 webmaster 只知道让 web 服务器运行起来,很少对 ntfs 进行权限设置,而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此,如果你是 Webmaster,作者强烈建议你密切关注服务器的设置,尽量将 web 目录建在 ntfs 分区上,目录不要设定 everyone full control,即使是是管理员组的成员一般也没什么必要 full control,只要有读取、更改权限就足够了。
四、 ASP 应用程序可能面临的攻击过去许多 Internet 上 CGI 写的留言本或 BBS 是把客户输入的留言变为一个变量,然后再把这个变量插入到显示留言的 HTML 文件里,因此客户输入的文本如要在 HTML 文件里显示就得符合 HTML 标准,而 CGI 程序里一般都加入了特定的 HTML 语言。当客户输入内容,插入 HTML 文件时,即同时插入到了头尾 HTML 语句中,如:
《 font》客户输入的变量 《 /font》但如果把前后的 HTML 标记给敝屏了,就可以做很多事情了。
如输入时打上:
《 /font》符合 HTML 标准的语句 《 font》前后的 《 font》是用来敝屏 CGI 中的 HTML 语句用的。插入到 HTML 文件里的就变成了:
《 font》《 /font》符合 HTML 标准的语句 《 font》《 /font》由于这样一个特性,使得写个 javascript 的死循环变得非常容易,只要在输入框中输入:
《 a href=〃URL〃 onMouseover=〃while(1){window。close(')}〃》或 《 a herf=〃URL〃 onMousever=〃while(ture){window。close(')}〃》
那么就能让其他查看该留言的客户的浏览器因死循环而死掉。 ASP 开发的程序同样可能存在这个问题,因此当你用 asp 编写类似程序时应该做好对此类操作的防范,譬如可以写一段程序判断客户端的输入,并屏蔽掉所有的 HTML、 Javascript 语句。
看完本期后,如果你非常的震惊,那么你必须彻底对你现有的网站或 asp 程序进行一翻检测,看看是否存在上述漏洞。如果你对文中所谈到的漏洞都有所了解并已有足够的对策,那么在恭喜你的同时,还是要提醒你经常查看你的网站和 asp 程序,如果你有数据库也应该经常查看,以防他人利用一些我们未知的漏洞进行攻击。最后,如果你对本文所谈论的 asp 安全性问题有什么独特的见解,或对漏洞有新的发现,希望能来信同我探讨。
??
??
??
??
………………………………………………………………………用户上传之内容结束……………………………………………………………………………………
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!