|
轉(zhuǎn)貼-給ASP程序多一點(diǎn)點(diǎn)安全感 (2000.03.28)
給ASP程序多一點(diǎn)點(diǎn)安全感
# 使用 On Error Resume Next 這一行語(yǔ)句等于告訴服務(wù)器處理程序:"如果我出錯(cuò)了,呵 呵不要管我,繼續(xù)……”。這樣做可以使你捕捉到很多可以 捕捉和處理的錯(cuò)誤,比那些一出錯(cuò)就把家底拿給人家看的代 碼好一些。調(diào)試的時(shí)候最好不要打開(kāi),一面無(wú)法發(fā)現(xiàn)哪里出 錯(cuò)了。
# 服務(wù)器IIS設(shè)置成出錯(cuò)后顯示"處理 URL 時(shí)服務(wù)器上出錯(cuò)。 請(qǐng)和系統(tǒng)管理員聯(lián)絡(luò)!保ㄔ趹(yīng)用程序配置中設(shè)置) 可以避免出錯(cuò)后透露細(xì)節(jié)給訪問(wèn)者,你的秘密就不用擔(dān)心從 出錯(cuò)信息中透露出去了。
# 檢查傳遞的參數(shù)合法性 這一點(diǎn)十分重要,根據(jù)我的測(cè)試,國(guó)內(nèi)很多站點(diǎn)上的 ASP 程序如果改變了它的參數(shù)的值,一般都會(huì)出錯(cuò)。檢查合法性 就可以明顯的降低出錯(cuò)概率。具體的方法這里不再敘述。
# 盡量少用 GET 方式傳遞參數(shù) 從最基本的一點(diǎn)上講,這種方式要比 POST 方式多傳輸一些 字節(jié)的 URL 給服務(wù)器,所占用的系統(tǒng)資源也會(huì)相應(yīng)增加。 從安全性的角度來(lái)看也是很有好處的,可以減少命令行式的 攻擊。
# 少用中文文件名 可能你覺(jué)得用中文文件名比較爽,可是從專業(yè)的角度來(lái)看, 這樣做存在著很多弊端。手工敲地址時(shí)變得繁瑣起來(lái);調(diào)試 中需要輸入文件名的地方還得打開(kāi)輸入法或者拷貝粘貼文件 名;本身就不夠?qū)I(yè)啦 ;-)
======================================================================轉(zhuǎn)貼-解決主頁(yè)中asp中文亂碼(2000.03.27)
解決主頁(yè)中asp中文亂碼
: 在做內(nèi)有VBscript的asp homepage時(shí),一個(gè)form提交方法為GET, : 當(dāng)form的表單傳給asp處理時(shí),入...asp?name="張三" : 可張三的中文已經(jīng)亂碼,請(qǐng)問(wèn)如何在asp中用vbscript將亂碼恢復(fù)成 : 正確的中文. : .......
對(duì)文字進(jìn)行如下cut()過(guò)程即可 <script language=vbscript runat=server> Function cut(str) length = Len(str) count = 1 Do While count <= length If strComp(Mid(str,count,1),"Z",1) > 0 Then length = length -1 End If count = count + 1 Loop cut = Left(str,Length) if Session("Version")<>3 then '若為高版本asp則不需處理 cut = str end if End Function </script>
======================================================================轉(zhuǎn)貼-盡可能的使用本地(局部)變量 (2000.03.24)
盡可能的使用本地(局部)變量
局部變量是在子程序和函數(shù)中定義的(也就是常說(shuō)局部范圍的變量),這些變量 被編譯成數(shù)字指向并放入一張表中。這些局部變量的指向可以通過(guò)一次編譯完成。 而全局變量則是在運(yùn)行時(shí)被執(zhí)行的。這就意味著局部變量的存取要比全局變量快 好幾倍。而且,多維全局變量是其中最慢的,當(dāng)?shù)谝淮问褂靡粋(gè)多維全局變量時(shí), 在新的對(duì)象產(chǎn)生之前,就要在整個(gè)對(duì)象模型中搜索一遍同名的對(duì)象。
以下是一個(gè)非常常見(jiàn)的例子: Foo.bar.blah.baz = Foo.bar.blah.qaz(1) If Foo.bar.blah.zaq = Foo.bar.blah.abc then 運(yùn)行時(shí)產(chǎn)生如下結(jié)果: 1)變量Foo被定義為一個(gè)全局變量 2)變量bar被定義為Foo的一個(gè)成員 3)變量blah被定義為Foo.bar的一個(gè)成員 4)變量qaz被定義為Foo.bar.blah的一個(gè)成員 5)調(diào)用 Foo.bar.blah.quaz(1) 6)重復(fù)1至3。系統(tǒng)并不知道如果調(diào)用qaz改變了對(duì)象模型1-3步必須重新執(zhí)行 7)定義baz為 Foo.bar.blah的成員,輸出值 8)重復(fù)1-3,執(zhí)行zaq 9)重復(fù)1-3,執(zhí)行abc
正如你看到的,效率極其低下,最快的方法就是把這些代碼寫在vbscript中: Set myobj = Foo.bar.blah ' do the resolution of blah ONCE Myobj.baz = myobj.qaz(1) If Myobj.zaq = Myobj.abc then
======================================================================轉(zhuǎn)貼-正確使用Global.asa (2000.03.23)
正確使用global.asa是ASP開(kāi)發(fā)者的一個(gè)共同問(wèn)題。最主要的是要知道什么時(shí)候該用 Virtual Application,什么時(shí)候該用Virtual directory,并且知道他們的不同。
Virtual Directories(虛擬目錄)
簡(jiǎn)而言之,virtual directories是虛擬出來(lái)的,不一定跟web root在同一個(gè)的目 錄上,可以是其他的。但是你可以像使用web root上的其他目錄一樣使用它。當(dāng) 運(yùn)行g(shù)lobal.asa以后,ASP就把所有的虛擬目錄看成是應(yīng)用程序根目錄上的子目錄。
值得注意,如果你的目錄已經(jīng)是website root上的一個(gè)物理目錄,那就沒(méi)有必要 再去為那個(gè)目錄做虛擬目錄了。當(dāng)然,你有也可以這樣做。如果你的目錄的路徑 實(shí)在是太長(zhǎng),長(zhǎng)到你無(wú)法忍受,想它短一點(diǎn)。你可以用建虛擬目錄的方法。使它 短些,容易記住。例如:原來(lái)的目錄http://mysite.com/directory1/directory 2/file.asp,你可以為它建一個(gè)虛擬的目錄,http://mysite.com/directory2/fi le.asp。這樣就方便多了了。
Virtual Applications(虛擬應(yīng)用程序)
Virtual Applications 是一個(gè)獨(dú)立于website的web applications,而它跟Virtual Directories一樣,不一定是web root上的一個(gè)目錄?梢允菑钠渌哪夸浱 擬出來(lái)的。ASP不允許應(yīng)用程序共享他們的application和session變量,換句話說(shuō), 就是應(yīng)用程序A不能訪問(wèn)應(yīng)用程序B(包括web root,因?yàn)閣eb root也是看作一個(gè) 應(yīng)用程序的根。)的application和session變量,他們是私有的。反之亦然。當(dāng)你 確信這個(gè)應(yīng)用程序不需要與整個(gè)website、website上其他子目錄上的ASP腳本共享 application和session變量,或者你想在同樣的內(nèi)存空間里隔離一個(gè)進(jìn)程來(lái)運(yùn)行 應(yīng)用程序時(shí)。你使用Virtual Applications是正確的。
要注意的一點(diǎn)是:在IIS 4.0里面的"新虛擬目錄向?qū)А?所建立的virtual directory (虛擬目錄)缺省就是一個(gè)virtual application(虛擬應(yīng)用程序)。要把它變回 virtual directory的話,你可以在目錄的"屬性”里,選擇"目錄”標(biāo)簽,單擊"卸載”。
小心使用多個(gè) Global.asa
在一個(gè)website里面使用多個(gè)Global.asa,我們必須要注意,因?yàn)槟鞘呛苋菀讓?dǎo)致 變量超出范圍而丟失的。通常我們必須限制在整個(gè)website上的Global.asa的樹(shù)木, 在每一個(gè)應(yīng)用程序的的根目錄里面放一個(gè)。這是保持session和application變 量比較好的方法,不至于它們會(huì)丟失。通過(guò)在各個(gè)目錄上放置global.asa文件, 我測(cè)試的asp文件,可以幫助我們理解它們的關(guān)系。
例子,下面是一個(gè)website的設(shè)置。在這個(gè)website下面有兩個(gè)目錄。一個(gè)Virtual Application(虛擬應(yīng)用程序)叫admin,一個(gè)Virtual Directory(虛擬目錄)叫 images。在每一個(gè)目錄下有2個(gè)文件:global.asa和default.asp。每一個(gè)目錄里的 default.asp都是一樣的,global.asa則根據(jù)不同的目錄有所改變。
這個(gè)是default.asp的內(nèi)容: <% Response.Write "Session Application_Directory = <b>" & Session("application_directory") & "</b><br>" Response.Write "Session Virtual_Directory = <b>" & Session("virtual_directory") & "</b><br>" Response.Write "Session Directory = <b>" & Session("directory") & "< /b><br>" %>
website root上global.asa的內(nèi)容:
SUB Session_OnStart Session("virtual_directory") = "Executed" Session("directory") = "Executed" END SUB
當(dāng)你用瀏覽器瀏覽default.asp時(shí),得到的結(jié)果是:
Session Application_Directory = Session Virtual_Directory = Executed Session Directory = Executed
Virtual directory(虛擬目錄) images 上global.asa的內(nèi)容是(把website root 上的global.asa稍微做修改):
SUB Session_OnStart Session("virtual_directory") = "Virtual Directory" Session("directory") = "Virtual Directory" END SUB
用瀏覽器瀏覽default.asp(images上的default.asp)時(shí),得到的結(jié)果是:
Session Application_Directory = Session Virtual_Directory = Executed Session Directory = Executed
雖然在這個(gè)目錄上的global.asa文件里,我們?yōu)閟ession變量賦了新的值。但是顯
示的仍然是website root上global.asa所設(shè)的值。
Virtual Application(虛擬應(yīng)用程序) Admin 上 global.asa的內(nèi)容:
SUB Session_OnStart Session("application_directory") = "Executed" END SUB
用瀏覽器瀏覽default.asp(admin上的default.asp)時(shí),得到的結(jié)果是:
Session Application_Directory = Executed Session Virtual_Directory = Session Directory =
正如你所看到的,Session("virtual_directory")和Session("directory") 的值 不能從root web 那里"帶”過(guò)來(lái)。
Global.asa 參考
Global.asa 文件是一個(gè)可選文件,用戶可以在該文件中指定事件腳本,并聲明具 有會(huì)話和應(yīng)用程序作用域的對(duì)象。該文件的內(nèi)容給用戶顯示的,而是用來(lái)存儲(chǔ)事 件信息和由應(yīng)用程序全局使用的對(duì)象。該文件的名稱必須是 Global.asa 且必須 存放在應(yīng)用程序的根目錄中。每個(gè)應(yīng)用程序只能有一個(gè) Global.asa 文件。
Global.asa 文件只能包含如下內(nèi)容:
用程序事件(Application_OnStart、Application_OnEnd) 會(huì)話事件(Session_OnStart、Session_OnEnd) <OBJECT> 聲明 TypeLibrary 聲明
如果包含的腳本沒(méi)有用 <SCRIPT> 標(biāo)記封裝,或定義的對(duì)象沒(méi)有會(huì)話或應(yīng)用程序 作用域,則服務(wù)器將返回錯(cuò)誤。服務(wù)器會(huì)忽略已標(biāo)記的但未被應(yīng)用程序或會(huì)話事 件使用的腳本以及文件中的 HTML 語(yǔ)句。
可以用任何支持腳本的語(yǔ)言編寫 Global.asa 文件中包含的腳本。如果多個(gè)事件 使用同一種腳本語(yǔ)言,就可以將它們組織在一組 <SCRIPT> 標(biāo)記中。
當(dāng)用戶保存對(duì) Global.asa 文件所做的更改時(shí),在重新編譯 Global.asa 文件之 前,服務(wù)器會(huì)結(jié)束處理當(dāng)前應(yīng)用程序的所有請(qǐng)求。在此期間,服務(wù)器拒絕其他請(qǐng) 求并返回一個(gè)錯(cuò)誤消息,說(shuō)明正在重啟動(dòng)應(yīng)用程序,不能處理請(qǐng)求。
當(dāng)用戶當(dāng)前的所有請(qǐng)求處理完之后,服務(wù)器對(duì)每個(gè)會(huì)話調(diào)用 Session_OnEnd 事件, 刪除所有活動(dòng)會(huì)話,并調(diào)用 Application_OnEnd 事件關(guān)閉應(yīng)用程序,然后編譯 Global.asa 文件。接下來(lái),用戶的請(qǐng)求將啟動(dòng)應(yīng)用程序并創(chuàng)建新的會(huì)話,觸發(fā) Application_OnStart 和 Session_OnStart 事件。
但是,保存 Global.asa 文件中所包含的文件的更改并不能使服務(wù)器重新編譯 Global.asa。為了讓服務(wù)器識(shí)別包含文件的改動(dòng),必須再保存一下Global.asa 文件。
在Global.asa 文件中聲明的過(guò)程只能從一個(gè)或多個(gè)與 Application_OnStart、 Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相關(guān)的腳本中調(diào)用。 在基于ASP的應(yīng)用程序中的 ASP 頁(yè)中,它們是不可用的。
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!