ASP(Active Server Pages)是微軟在 1996 年推出的伺服器端網頁技術,讓開發者用 VBScript 在 IIS 伺服器上動態產生 HTML;為了和後來的 ASP.NET 區分,現在通稱 Classic ASP。它的最後一個版本 ASP 3.0 發表於 2000 年,之後再無新版,但 IIS 至今仍保留 ASP 功能,台灣仍有不少企業官網與內部系統在上面運作。這篇文章整理 ASP 的運作原理、基本語法、表單與資料庫範例,並回答網站主最常問的兩個問題:ASP 和 ASP.NET 差在哪、舊 ASP 網站該怎麼辦。本文屬於《網頁程式語言》系列,總覽請見〈網頁程式設計入門〉。
一、ASP 是什麼?
ASP 是微軟的伺服器端腳本技術:把 <% %> 包起來的腳本嵌在 HTML 裡,由 IIS(Internet Information Services)在伺服器上執行,再把產生的 HTML 送給瀏覽器。檔案副檔名是 .asp,預設腳本語言是 VBScript,也可以改用 JScript(微軟版的 JavaScript)。
ASP 1.0 在 1996 年隨 IIS 3.0 推出,2.0 在 1997 年、3.0 在 2000 年隨 Windows 2000 與 IIS 5 發布,之後微軟把資源全部轉向 2002 年問世的 ASP.NET。也就是說,ASP 是一項 25 年沒有新版本的技術,「Classic ASP」這個稱呼就是這樣來的。它和 PHP、JSP 同屬第一代伺服器端網頁技術,三者的定位差異見第五節與〈PHP 語法介紹〉。
二、ASP 怎麼運作?IIS 與五個內建物件
ASP 是直譯式的:IIS 收到 .asp 請求時,交給 ASP 引擎逐行解譯腳本,不需要事先編譯。寫好存檔、重新整理就能看結果,這也是它當年受歡迎的原因。所有 ASP 程式都圍繞五個內建物件:
| 內建物件 | 用途 | 常用方法或屬性 |
|---|---|---|
| Request | 讀取瀏覽器送來的資料 | Request.Form、Request.QueryString、Request.Cookies |
| Response | 送資料回瀏覽器 | Response.Write、Response.Redirect、Response.Cookies |
| Server | 伺服器端工具 | Server.CreateObject(建立 COM 元件)、Server.MapPath、Server.HTMLEncode |
| Session | 單一訪客的狀態 | Session("userId")、Session.Timeout |
| Application | 整個網站共用的狀態 | Application("visitCount")、Application.Lock |
三、ASP 基本語法範例
ASP 的語法就是 VBScript 的語法,再加上上面五個物件。VBScript 本身的特徵(不分大小寫、單引號註解、& 串接字串、End If 收尾)請見 VBScript 專文,以下只示範 ASP 特有的部分。
1. 輸出文字
<%@ Language="VBScript" CodePage="65001" %>
<%
Response.Write("Hello, ASP!")
%>
第一行的 CodePage="65001" 指定 UTF-8,處理中文時建議一律加上。<%= 變數 %> 是 Response.Write 的縮寫,兩者等價。
2. 變數
<%
Dim name
name = "王小明"
Response.Write("Hello, " & name)
%>
3. 條件判斷
<%
Dim age
age = 18
If age >= 18 Then
Response.Write("您已成年")
Else
Response.Write("您尚未成年")
End If
%>
4. 迴圈
<%
Dim i
For i = 1 To 5
Response.Write("這是第 " & i & " 次迴圈<br>")
Next
%>
5. 函數
<%
Function SayHello(name)
SayHello = "Hello, " & name
End Function
Response.Write(SayHello("Alice"))
%>
VBScript 的函數用「把值指定給函數名稱」來回傳,沒有 return 關鍵字。
6. 表單處理
<form method="post" action="<%= Request.ServerVariables("SCRIPT_NAME") %>">
姓名:<input type="text" name="name"><br>
<input type="submit" value="送出">
</form>
<%
If Request.Form("name") <> "" Then
Dim userName
userName = Request.Form("name")
Response.Write("您輸入的姓名是:" & Server.HTMLEncode(userName))
End If
%>
表單送回同一頁,ASP 用 Request.Form 取值後輸出。範例多加了 Server.HTMLEncode:把使用者輸入原樣印回網頁是跨站腳本(XSS)最常見的破口,任何要輸出的外部資料都應先編碼。
四、與資料庫互動:ADODB 範例與安全提醒
ASP 透過 ADO(ActiveX Data Objects)連資料庫,早年最常搭配 Access(.mdb)與 SQL Server。以下是連 SQL Server 查詢的範例,已改成參數化查詢:
<%
Dim conn, cmd, rs
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=YourDatabase;User ID=YourUser;Password=YourPassword;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT id, name FROM users WHERE status = ?"
cmd.Parameters.Append cmd.CreateParameter("status", 3, 1, , 1) ' 3 = adInteger, 1 = adParamInput
Set rs = cmd.Execute
If rs.EOF Then
Response.Write("無資料")
Else
Do While Not rs.EOF
Response.Write("ID:" & rs("id") & ",名字:" & Server.HTMLEncode(rs("name")) & "<br>")
rs.MoveNext
Loop
End If
rs.Close : Set rs = Nothing
conn.Close : Set conn = Nothing
%>
Request.QueryString("id") 直接串進 SQL 字串("SELECT ... WHERE id=" & id),是 SQL 注入的教科書案例。修正方式是像範例一樣用 ADODB.Command 的參數;另外連線字串不該寫在每一頁,應集中在一個 include 檔並放在網站根目錄之外。網站被植入惡意程式後,搜尋結果會出現「這個網站可能會危害您的電腦」警告,對品牌與排名的傷害遠大於修補成本。
五、ASP 與 ASP.NET 差在哪?
兩者只有名字像,底層完全不同:ASP 是直譯的 VBScript 腳本,ASP.NET 是編譯的 .NET 應用程式,以 C# 為主要語言。檔案副檔名一個是 .asp、一個是 .aspx 或 Razor 的 .cshtml;ASP 程式不能直接在 ASP.NET 執行,升級等於重寫。至於 ASP.NET 自己又分成綁 Windows 的 .NET Framework 版與跨平台的 ASP.NET Core,三者的完整對照表與版本支援時程,統一整理在〈ASP.NET 是什麼〉,本文不重複。
六、Classic ASP 的現況:還能用嗎?
能用,但是「維護模式」:微軟自 ASP 3.0 之後未再推出新版本,IIS 7 起 ASP 不再預設安裝,需要手動勾選功能,但最新的 Windows Server 仍然提供這個選項。微軟文件也曾說明 ASP 在 Windows 8 之後至少支援十年,這個承諾期已在 2022 年底前走完,目前的狀態是「隨 Windows 與 IIS 一起存在,沒有新功能,安全性修補隨作業系統發布」。
對網站主而言,這代表三個現實:
- 主機只能是 Windows:ASP 依賴 IIS 與 COM 元件,Linux 主機跑不動,租用成本通常高於 PHP 主機。
- 人才越來越少:新進工程師幾乎不學 Classic ASP,維護報價逐年上升,找不到人接手的風險比技術本身更大。
- 安全依賴自己:語言本身不會再補強,SQL 注入、XSS、過時的 COM 元件都要靠程式碼層面自行防護。
七、舊 ASP 網站的三條路
- 維持現狀並補強:系統運作正常、功能不再擴充時是合理選擇。至少做三件事:全站改參數化查詢、輸出一律
HTMLEncode、確認 IIS 與 Windows 有持續更新。 - 改寫為 ASP.NET Core:資料庫(SQL Server)與團隊都在微軟生態時最順。ASP.NET Core 可跑 Linux,主機選擇變寬,但程式要全部重寫。
- 改寫為 PHP 或其他語言:以官網、詢問單、內容行銷為主的中小企業常選這條路,主機普及、費用低、後續維護人選多。代價同樣是重寫,資料要從 Access 或 SQL Server 轉到 MySQL。
不論走哪條路,換網址結構時務必做好 301 轉址,否則累積多年的搜尋排名會一夕歸零;作法見〈301 與 302 轉址教學〉。
八、我們評估 ASP 舊站時的檢查點
網站改版的前置盤點裡,遇到 .asp 網址我們會先確認四件事,因為它們直接決定報價與時程:
- 資料庫是什麼:Access .mdb 檔還是 SQL Server?前者通常只有幾萬筆資料、轉檔簡單;後者要確認版本與授權。
- 有沒有第三方 COM 元件:上傳、寄信、產圖常用的舊元件(透過
Server.CreateObject呼叫)在新主機上多半找不到相容版本,這些功能必須重做。 - 網址型態:典型的
product.asp?id=123若已有排名,新站要逐一對應 301,不能只轉首頁。 - 是否還有客戶端 VBScript:很多 ASP 站同時在瀏覽器端用 VBScript 做表單驗證,那部分早已失效,判斷方法見〈VBScript 是什麼〉第六節。
本站(newscan.com.tw)自建站以來即以 PHP 與 MySQL 開發,沒有經歷過 ASP 遷移;上述檢查點來自替客戶做改版評估的實務,不涉及任何特定客戶的資料。
九、結論
ASP 是 1990 年代末期微軟的第一代動態網頁技術,語法簡單、和 IIS 綁定,至今仍能運作,但已 25 年沒有新版本。如果您是學習者,理解它的五個內建物件就足以看懂舊系統;如果您是網站主,重點不是 ASP 好不好,而是主機、人才與安全三項長期成本值不值得繼續付。
要學現代的微軟網頁技術,直接從 ASP.NET Core 開始;要理解伺服器端網頁技術的整體版圖,回到〈網頁程式設計入門〉。
十、常見問答 FAQ
ASP 是什麼?
ASP 和 ASP.NET 一樣嗎?
Classic ASP 現在還能用嗎?
.asp 網頁需要什麼主機?
ASP 用什麼語言寫?
參考來源
- Microsoft Learn,〈Classic ASP Not Installed by Default on IIS 7.0 and above〉,Microsoft 官方文件。
- Microsoft Learn,〈ASP Built-in Objects〉,Microsoft 官方文件。
- OWASP,〈SQL Injection Prevention Cheat Sheet〉,OWASP Cheat Sheet Series。
- 新視野網頁設計,〈ASP.NET 是什麼?語法介紹、ASP.NET Core 現況與 Web Forms 差別〉,本站自有內容。
- 新視野網頁設計,〈VBScript 是什麼?語法介紹、IE 退場後的現況與 JavaScript 替代方案〉,本站自有內容。
IIS 對 Classic ASP 的支援狀態依 2026 年 9 月查閱的微軟文件整理;第八節為本站承接網站改版評估時的實務檢查項目,不涉及特定客戶資料。