| 
| 我们都知道asp这一类的服务器端处理的程序,其好处之一就是只向客户端输出 标准的Html流。因此可以起到向客户隐藏细节的作用。也就是说当我们在浏览器中
 键入asp程序的网址后只能看见标准的Html文件,而不能看见asp的内容。但有时,
 例如在一个asp的教学站点,我们有必要显示asp文件的内容,或者你愿意将你的原
 代码与人享,通过一个程序将代码显示出来。
 下面是我编写的一个asp程序,view_code.asp,它提供两种提交方式:一种是用
 表格提交,即你知道了该源文件的物理地址(类似于:c:\asp_source\test.asp的
 形式)。一种是采用get方式提交(类似于:<a href="view_code.asp?code_path=
 <%=server.mappath(request.servervariables("PATH_INFO"))%>&cgi_type=asp">
 点击此处查看原代码</a>)。另外它还支持两种cgi脚本,一种是asp,一种是php。
 
 代码段:
 <%
 on error resume next
 '忽略程序执行中的错误,在程序的最后统一处理。
 %>
 <%
 function rt_min(num1,num2)
 '该子程序用于返回两数中不等于零的最小数。
 if num1=0 and num2=0 then
 rt_min=-1
 elseif num1=0 then
 rt_min=num2
 elseif num2=0 then
 rt_min=num1
 elseif num1<num2 then
 rt_min=num1
 else
 rt_min=num2
 end if
 end function
 %>
 <%
 function line_check(strline,cgi_type)
 '该子程序用于检查输入段中是否包含有"<%、%>、<script或</script的特殊字符
 dim cgi_flag
 if cgi_type="php" then
 cgi_flag="?"
 else
 cgi_flag="%"
 end if
 '定义的cgi_flag用于代表php和asp的不同标识符
 line_check=0
 itemp=0
 ipos=instr(strline,"<"&cgi_flag)
 if rt_min(ipos,itemp)=ipos then
 itemp=ipos
 line_check=1
 end if
 ipos=instr(strline,cgi_flag&">")
 if rt_min(ipos,itemp)=ipos then
 itemp=ipos
 line_check=2
 end if
 ipos=instr(1,strline,"<"&"script",1)
 if rt_min(ipos,itemp)=ipos then
 itemp=ipos
 line_check=3
 end if
 ipos=instr(1,strline,"<"&"/script",1)
 if rt_min(ipos,itemp)=ipos then
 itemp=ipos
 line_check=4
 end if
 end function
 %>
 <%
 sub printhtml(strline)
 '该子过程用于打印不含有上述四种特殊标记的行
 ispace=len(strline)-len(ltrim(strline))
 i=1
 while(mid(strline,i,1))=chr(9)
 ispace=ispace+5
 i=i+1
 wend
 '统计空白的数量
 if ispace>0 then
 for i=1 to ispace
 response.write(" ")
 next
 end if
 ipos=instr(strline,"<")
 if ipos then
 response.write(left(strline,ipos-1))
 response.write("<")
 '用<来替代<,使浏览器不解释<>中的标记
 strline=right(strline,len(strline)-ipos)
 call printhtml(strline)
 '自调用,直到没有<的出现
 else
 response.write(strline)
 end if
 end sub
 %>
 <%
 sub printline(strline,iflag,cgi_type)
 '该自过程用于根据line_check的返回值分别处理
 dim cgi_flag
 if cgi_type="php" then
 cgi_flag="?"
 else
 cgi_flag="%"
 end if
 select case iflag
 case 0
 call printhtml(strline)
 case 1
 ipos=instr(strline,"<"&cgi_flag)
 call printhtml(left(strline,ipos-1))
 response.write("<font color=#ff0000>")
 response.write("<"&cgi_flag)
 strline=right(strline,len(strline)-ipos-1)
 call printline(strline,line_check(strline,cgi_type),cgi_type)
 '自调用,直到没有四种特殊标记的出现
 case 2
 ipos=instr(strline,cgi_flag&">")
 call printhtml(left(strline,ipos-1))
 response.write(cgi_flag&">")
 response.write("</font>")
 strline=right(strline,len(strline)-ipos-1)
 call printline(strline,line_check(strline,cgi_type),cgi_type)
 case 3
 ipos=instr(1,strline,"<"&"script",1)
 call printhtml(left(strline,ipos-1))
 response.write("<font color=#00ff00>")
 response.write("<"&"script")
 strline=right(strline,len(strline)-ipos-6)
 call printline(strline,line_check(strline.cgi_type),cgi_type)
 case 4
 ipos=instr(1,strline,"<"&"/script>",1)
 call printhtml(left(strline,ipos-1))
 response.write("lt;"&"/script"&">")
 response.write("</font>")
 strline=right(strline,len(strline)-ipos-8)
 call printline(strline,line_check(strline,cgi_type),cgi_type)
 case else
 response.write("error")
 end select
 end sub
 %>
 <html>
 <head>
 <title> view cgi_code(.asp or .php) </title>
 </head>
 <body>
 <form action="view_code.asp" method="POST">
 请输入路径:<input type=text name="code_path">
 请选择类型:<select name="cgi_type">
 <option value="asp">asp</option>
 <option value="php">php</option>
 </select>
 <input type=submit>
 </form>
 <hr>
 <%
 if vartype(request.servervariables("HTTP_REFERER")) then
 '判断该页面是否是由其他的页面申请提交,若用户是直接在浏览器中输入地址
 而来的,则HTTP_REFERER环境变量应该没有被初始化
 if request.servervariables("REQUEST_METHOD")="POST" then
 code_path=request.form("code_path")
 cgi_type=request.form("cgi_type")
 response.write("下面的代码来自表格的提交:"&"<br>")
 response.write("路径为:"&code_path&"<br>")
 elseif request.servervariables("REQUEST_METHOD")="GET" then
 code_path=request.querystring("code_path")
 cgi_type=request.querystring("cgi_type")
 response.write("下面的代码来自"&code_path&"的提交:"&"<br>")
 response.write("路径为:"&code_path&"<br>")
 end if
 '根据提交方式的不同显示不同的提示
 set fileobject=server.createobject("Scripting.FileSystemObject")
 if fileobject.fileexists(code_path) then
 '检查要打开的文件是否存在
 set stream=fileobject.opentextfile(code_path,1,false,0)
 while not stream.atendofstream
 stroutput=stream.readline
 call printline(stroutput,line_check(stroutput,cgi_type),cgi_type)
 '将该文件的每一行都分别交给printline来处理
 response.write("<br>")
 wend
 set stream=nothing
 else
 response.write("不能打开文件"&"<br>")
 end if
 end if
 %>
 </body>
 </html>
 <%
 '下面的代码为统一的错误处理段,它根据程序运行时产生的错误代码来分别处理
 if err.number<>0 then
 response.write("error"&"<br>")
 response.write("错误代码:"&err.number&"<br>")
 response.write("错误描述:"&err.description)
 end if
 %>
 
 最后,我在给出一个引用该程序的测试页面
 <html>
 <head>
 <title>显示代码的测试页面</title>
 </head>
 <body>
 <a href="view_code.asp?code_path=<%=server.mappath(request.servervariables
 ("PATH_INFO"))%>&cgi_type=asp">点击此处查看该页的源码</a>
 </body>
 </html>
 
 |  |