asp 转贴点好东东 (www.Jojoo.net)  2003-5-10 (请双击自动滚屏观看,单击停止,再击..)  转贴点好东东 一、程序员易犯的20条错误 1.不要将没有过滤的用户输入发送给客户端. 如:Response.Write "You have entered " & Request("UserInput") 2.不要信任客户端和SESSION变量. 3.不要忘记指定字符集. <META http-equiv="Content-Type" content="text/html; charset=GB2312"> 4.不要在没处理文件路径的情况下让用户访问文件. 如:这样的表达式是不正常的. http://www.example.net/article.asp?file=new.htm 这将导致以下情况的发生: http://www.example.net/article.asp?file=/global.asa http://www.example.net/article.asp?file=/../../../boot.ini http://www.example.net/article.asp?file=LPT1 http://www.example.net/article.asp?file=\%2e%2e\global.asa 可用以下方法来正确处理该情况: <% Set fso = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set f = fso.GetFile(request("file")) If err then  Response.Write "Error" Else  Response.Write f.Path End If %> 
5.在没有过滤用户输入的情况下,不要进行SQL查询. 6.如果你的数据库内容来自用户的输入,不要相信它. 7.不要将密码或者其它敏感的数据保存在ASP页面中. 8.不要依赖弱安全检查的内容. 如:HTTP重定向,HTML中的TEXT字段的最大长度限制等等. 9.不要将注释留在HTML页面中,特别是一些敏感信息. 10.不要给出太多不必要的信息给客户端. 如在一个登录页面,登录失败的信息就不能太多,如果将:密码是四位,用户不存在等过多的信息给客户端,将会给那些不怀好意的家伙有机可乘! 11.不要在当前路径下写文件,数据库操作.要将文件,数据库文件单独放在一个分区或在WEB根目录这外的目录下. 12.不要在URL中带敏感信息. 13.不要使用INC文件. 因为IIS默认情况下是不处理INC文件的,最好用.INC.ASP扩展名. 14.不要在没有验证用户输入的情况下发送邮件. 15.不要在FORM的HIDDEN字段中保存敏感数据. 16.不要让IIS来处理错误,因为会发送太多的信息给客户端. 最好将IIS的脚本调试改为只发送文本信息. 17.好好的控制你的代码. 将那些不用的,临时的代码都删除,如.test.asp,index.asp.bak 18.在没有测试的情况下不要发布你的代码. 19.不要将不必要的敏感数据存在数据库中,这样万一你的数据库被攻破,也不要造成更大的损失. 20.不要以为这样就够了,还有更多的情况要在实际中被考虑到. 二、Adodb.Stream 的使用说明
组件:"Adodb.Stream" 有下列方法: Cancel 方法      使用方法如下      Object.Cancel      说明:取消执行挂起的异步 Execute 或 Open 方法的调用。 Close  方法      使用方法如下      Object.Close      :关闭对像 CopyTo 方法      使用方法如下      Object.CopyTo(destStream,[CharNumber])      说明:将对像的数据复制,destStream指向要复制的对像,CharNumber为可选参数,指要复制的字节数,不选为全部复制。 Flush  方法      使用方法如下      Object.Flush      说明: LoadFromFile 方法      使用方法如下      Object.LoadFromFile(FileName)      说明:将FileName指定的文件装入对像中,参数FileName为指定的用户名。 Open  方法        使用方法如下       Object.Open(Source,[Mode],[Options],[UserName],[Password])       说明:打开对像,       参数说明:Sourece 对像源,可不指定   Mode 指定打开模式,可不指定,可选参数如下:     adModeRead  =1     adModeReadWrite =3     adModeRecursive =4194304     adModeShareDenyNone =16     adModeShareDenyRead =4     adModeShareDenyWrite =8     adModeShareExclusive =12     adModeUnknown  =0     adModeWrite  =2   Options 指定打开的选项,可不指定,可选参数如下:     adOpenStreamAsync =1     adOpenStreamFromRecord =4     adOpenStreamUnspecified=-1   UserName 指定用户名,可不指定。   Password 指定用户名的密码 Read  方法  使用方法如下:  Object.Read(Numbytes)  说明:读取指定长度的二进制内容。  参数说明:Numbytes指定的要读取的找度,不指定则读取全部。 ReadText  方法   使用方法如下:  Object.ReadText(NumChars)  说明:读取指定长度的文本  参数说明:NumChars指定的要读取的找度,不指定则读取全部。 SaveToFile  方法   使用方法如下:  Object.SaveToFile(FileName,[Options])  说明:将对像的内容写到FileName指定的文件中  参数说明:FileName指定的文件     Options 存取的选项,可不指定,可选参数如下:       adSaveCreateNotExist  =1       adSaveCreateOverWrite =2 SetEOS  方法  使用方法如下:  Object.setEOS()  说明: SkipLine  方法  使用方法如下:  Object.SkipLine()  说明: Write  方法  使用方法如下:  Object.Write(Buffer)  说明:将指定的数据装入对像中。  参数说明:Buffer 为指定的要写入的内容。 WriteText  方法  使用方法如下:  Object.Write(Data,[Options])  说明:将指定的文本数据装入对像中。  参数说明:Data 为指定的要写入的内容。            Options 写入的选项,可不指定,可选参数如下:     adWriteChar  =0     adWriteLine  =1   有下列属性:  Charset   EOS 返回对像内数据是否为空。
 LineSeparator 指定换行格式,可选参数有   adCR   =13   adCRLF   =-1   adLF   =10    Mode 指定或返加模式。    Position 指定或返加对像内数据的当前指针。    Size 返回对像内数据的大小。    State 返加对像状态是否打开。    Type 指定或返回的数据类型,可选参数为:   adTypeBinary  =1   adTypeText  =2 三、根据需要动态include不同的文件(需要FSO支持)
受<! #include file="filename.asp" --> 宏限制 必须存在该文件并且会预先编译(不管前面是否加以条件) 经常有这样的要求,根据不同的需求要求include不同的文件 如各个人的不同设置,所以要求能动态include文件。 代码如下: Function include(filename)  Dim re,content,fso,f,aspStart,aspEnd    set fso=CreateObject("Scripting.FileSystemObject")  set f=fso.OpenTextFile(server.mappath(filename))  content=f.ReadAll  f.close  set f=nothing  set fso=nothing    set re=new RegExp  re.pattern="^\s*="  aspEnd=1  aspStart=inStr(aspEnd,content,"<%")+2  do while aspStart>aspEnd+1    Response.write Mid(content,aspEnd,aspStart-aspEnd-2)   aspEnd=inStr(aspStart,content,"%\>")+2   Execute(re.replace(Mid(content,aspStart,aspEnd-aspStart-2),"Response.Write "))   aspStart=inStr(aspEnd,content,"<%")+2  loop  Response.write Mid(content,aspEnd)   set re=nothing End Function 使用范例: include("youinc.asp") 四、在浏览器中动态显示图形(利用owc)(一)  大家在编写ASP程序的时候,可能要对各种指标以图形的方式显示出来。如果仅仅是柱状图,可以采用画表格的方法。许多投票程序多采用这种方法。如果是饼状图或从数据库中检索数据后再显示,就有些困难了.办法也有,自己可以封装excel来完成上述功能,或者用deiphi做一个activeform传入参数,或者用php来写(做出的图有些难看),java也可以。当然,用一个比较成熟的图形组件来完成更好一些。microsoft  office  web  compoent非常不错。我在开发一个项目的时候,用到了这个组件。  CHART.ASP程序。  <%  Option  Explicit  %>  <!--#include  file="adovbs.inc"-->  <HTML>  <HEAD>  <TITLE>柱状图的例子</TITLE>  <%  Function  ExportChartToGIF(objCSpace,  strAbsFilePath,  strRelFilePath)  Dim  strFileName  Randomize    strFileName  =  Timer  &  Rnd  &  ".gif"  objCSpace.ExportPicture  strAbsFilePath  &  "\"  &  strFileName,  "gif",  650,  400  ExportChartToGIF  =  strRelFilePath  &  "/"  &  strFileName  End  Function  Sub  CleanUpGIF(GIFpath)  Dim  objFS  Dim  objFolder  Dim  gif  set  objFS  =  Server.CreateObject("Scripting.FileSystemObject")  set  objFolder  =  objFS.GetFolder(GIFpath)  for  each  gif  in  objFolder.Files  if  instr(gif.Name,  ".gif")  >  0  and    DateDiff("n",  gif.DateLastModified,  now)  >  10  then  objFS.DeleteFile  GIFpath  &  "\"  &  gif.Name,  True  end  if  next  set  objFolder  =  nothing  set  objFS  =  nothing  End  Sub  %>  </HEAD>  <BODY  BGCOLOR="#FFFFFF">  <div  align="center">  <br/>  <br/>  <%  dim  sj1,sj2  sj1=Request.QueryString("s1")  sj2=Request.QueryString("s2")    dim  objChartSpace  dim  objChart  dim  objSeries  dim  objConn  dim  objRS  dim  c  dim  series  dim  strChartAbsPath  dim  strChartRelPath  dim  strChartFile  dim  axis  strChartAbsPath  =  Server.MapPath("/xjsi-web/dcss/chart")  strChartRelPath  =  "/xjsi-web/dcss/chart"  '设置组件  set  objChartSpace  =  Server.CreateObject("OWC.Chart")  set  objChart  =  objChartSpace.Charts.Add  set  c  =  objChartSpace.Constants  objChartSpace.Border.Color="red"  '以柱状图显示  objchart.type=1  objChart.HasLegend  =  True'是否显示图例  objChartSpace.HasChartSpaceTitle=true  '显示标题  objChartSpace.ChartSpaceTitle.Caption  ="柱状图的例子使用office  web组件--九月天空中文技术网站"    set  objConn  =  Server.CreateObject("ADODB.Connection")  objConn.Open  application("strconn")  set  objRS  =  Server.CreateObject("ADODB.Recordset")  set  objRS.ActiveConnection  =  objConn  objRS.CursorType  =  adOpenStatic  objRS.CursorLocation  =  adUseClient  objRS.Open  "select  dwsj,sum(jfrs)  as  jfrs    from  dcss_do_jfgcfxb  where  dwsj>='"&sj1&"'  and  dwsj<'"&sj2&"'    group  by  dwsj  order  by  dwsj  asc"  set  objChartSpace.DataSource  =  objRS  '显示图例内容  objChart.SetData  c.chDimSeriesNames,  0,  "jfrs"  for  each  objSeries  in  objChart.SeriesCollection  objSeries.SetData  c.chDimCategories,  0,  "dwsj"  objSeries.SetData  c.chDimvalues,  0,  "jfrs"  next  for  each  axis  in  objChart.Axes  axis.HasTitle  =  True  if  axis.Type  =  c.chCategoryAxis  then  axis.Title.Caption  =  "月份"  else  axis.Title.Caption  =  "人数"  end  if  next  strChartFile  =  ExportChartToGIF(objChartSpace,  strChartAbsPath,  strChartRelPath)  Response.Write  "<IMG  SRC="""  &  strChartFile  &  """>"  &  "<P>"  CleanUpGIF  strChartAbsPath  objRS.Close  set  objRS  =  nothing  set  objConn  =  nothing  set  objSeries  =  nothing  set  objChart  =  nothing  set  objChartSpace  =  nothing  %>  </div>  </BODY>  </HTML>  使用这个组件的注意事项:  1。在office2000的光盘上,有一个msowc.msi的可执行文件.OK  2。建议大家用visual  interdev6.0开发,代码的自动提示功能此时会发挥出极大的作用  五、ASP备份Sql Server数据库(方法我没有试过) 1. <% Dim objSQLServer Dim objBackup  Set objSQLServer = Server.CreateObject("SQLDMO.SQLServer") objSQLServer.Connect "Localhost", "sa", "sa" Set objBackup = Server.CreateObject("SQLDMO.Backup") objBackup.Database = "vehicle" objBackup.Files="d:\vehicle.bak" objBackup.MediaDescription = "Back of vehicle" On Error Resume Next objBackup.SQLBackup(objSQLServer) if Err<>0 then  strErr = Err.Description  response.write strErr else   response.write "êy?Y3é1|±?·Y!" end if %> 2. 文件1:BackupDB.asp
<%@ Language=VBScript %> <HTML> <HEAD> <META name=VI60_defaultClientScript content=VBScript> <META NAME="GENERATOR" Content="Microsoft FrontPage 4.0"> <SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript> <!-- Sub btnbak_onclick if frmbak.txtsvr.value="" then window.alert("'Server Name' is empty!") frmbak.txtsvr.focus exit sub end if if frmbak.txtuid.value="" then window.alert("'Administrators' is empty!") frmbak.txtuid.focus exit sub end if if frmbak.txtdb.value="" then window.alert("'Database' is empty!") frmbak.txtdb.focus exit sub end if if frmbak.txtto.value="" then window.alert("'Backup To' is empty!") frmbak.txtto.focus exit sub end if frmbak.submit End Sub --> </SCRIPT> <link rel="stylesheet" href="../../sheets/B2BStyle.css"> </HEAD> <form action="backupdbsave.asp" method="post" id=frmbak name=frmbak> <body class="bg_frame_up"> <p class=heading> Database --> Backup</p> <P align=center> <div align="center"> <center> <table width="60%" cellpadding=1 cellspacing=1 border=0 align=center> <tr> <td class=TD_Mand_FN align="center" height="35" width="40%">Server Name:</td> <td class=TD_Mand_F height="35" width="59%">  <INPUT id=txtsvr name=txtsvr size="20" style="font-family: Arial; font-size: 9pt"></td> </tr> <tr> <td class=TD_Mand_FN align="center" height="35" width="40%">Administrators:</td> <td class=TD_Mand_F height="35" width="59%">  <INPUT id=txtuid name=txtuid size="20" style="font-family: Arial; font-size: 9pt"></td> </tr> <tr> <td class=TD_Mand_FN align="center" height="35" width="40%">Password:</td> <td class=TD_Mand_F height="35" width="59%">  <INPUT id=txtpwd name=txtpwd type=password style="font-family: Arial; font-size: 9pt"></td> </tr> <tr> <td class=TD_Mand_FN align="center" height="35" width="40%">Database:</td> <td class=TD_Mand_F height="35" width="59%">  <p align="left">  <INPUT id=txtdb name=txtdb size="20" style="font-family: Arial; font-size: 9pt"></p> </td> </tr> <td class=TD_Mand_FN align="center" height="35" width="40%">Backup To:<br/> <u>(Server Path)</u></td>  <td class=TD_Mand_F height="35" width="59%">  <input id=txtto name=txtto style="font-family: Arial; font-size: 9pt"></td>  </tr>  </table>  </center> </div>  <p align=center><input id=btnbak name=btnbak type=button value="Start Backup" style="font-family: Arial; font-size: 9pt"></p>  </body>  </form>  </HTML>  文件2:BackupDBSave.asp
<%@ Language=VBScript %> <% dim msvr,muid,mpwd,mdb,mto msvr=Request.Form("txtsvr") muid=Request.Form("txtuid") mpwd=Request.Form("txtpwd") mdb=Request.Form("txtdb") mto=Request.Form("txtto") if mpwd="" then mpwd="''" on error resume next set dmosvr=server.CreateObject("SQLDMO.SQLServer") dmosvr.connect msvr,muid,mpwd if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number) mdevname="Backup_"&muid&"_"&mdb set dmodev=server.CreateObject("SQLDMO.BackupDevice") dmodev.name=mdevname dmodev.type=2 dmodev.PhysicalLocation=mto dmosvr.BackupDevices.Add dmodev if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number) set dmobak=server.CreateObject("SQLDMO.Backup") dmobak.database=mdb dmobak.devices=mdevname %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <body background="../../Images/dot.gif"> <p><strong>Backuping, wait please...</strong></p> <% dmobak.sqlbackup dmosvr if err.number>0 then Response.Redirect("http:backuperr.asp?err="&err.number) dmosvr.backupdevices(mdevname).remove set dmobak=nothing set dmodev=nothing dmosvr.disconnect set dmosvr=nothing %> <p><strong>Database '<%=mdb%>' backup successed!</strong></p> </BODY> </HTML> 文件3:BackupErr.asp
<%@ Language=VBScript %> <% dim errno,errstr errno=Request.QueryString("err") errstr="" select case cstr(errno) case "18456" errstr="administrators or password error!" case "20482" errstr="server name error or server cannot connect!" case "911" errstr="database not found!" case "15026" errstr="server path not found!" case "3201" errstr="server path not found!" case "3254" errstr="restore from file lawlessness!" case else errstr="unknown error! retry later please!" end select %> <HTML> <HEAD> <META name=VI60_defaultClientScript content=VBScript> <META NAME="GENERATOR" Content="Microsoft FrontPage 4.0"> <SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript> <!-- Sub btnret_onclick history.back End Sub --> </SCRIPT> <title></title> </HEAD> <body class="bg_frame_up"> <p align=center><font color=#006666><%=errstr%></font></p> <p align=center><input id=btnret name=btnret type=button value=Return style="font-family: Arial; font-size: 9pt"></p> </BODY> </HTML> 
|