原始代碼風險分析
文章提供的 ASP 代碼片段存在**嚴重安全缺陷**,僅供教學反面參考:
<% ' chklogin.ASP - 極度不安全示例 %>
username = request.form("username")
password = request.Form("password")
if username="admin" and password="admin" then ' 硬編碼弱口令、明文比對
response.cookies("adminok")=true ' 無 HttpOnly/Secure/SameSite、無簽名防篡改
response.redirect "manage.ASP"
else
response.redirect "index.ASP" ' 失敗無日志、無鎖定、用戶枚舉風險
end if
核心漏洞
- 硬編碼憑證: 密碼寫死在代碼中,源碼洩露即全盤崩潰;無法輪換、無法審計、無法多用戶。
- 明文存儲/傳輸/比對: 無 HTTPS (SSL/TLS) 傳輸加密,密碼在網絡、內存、日志中裸奔;無哈希存儲 (bcrypt/Argon2/PBKDF2),資料庫被拖即明文。
- SQL 注入前奏: 雖片段未顯示 SQL,但經典 ASP 模式 `sql = "select * from users where user='" & username & "' and pwd='" & password & "'"` 直接拼接,**絕對存在注入**。
- 會話管理缺陷: 僅設置普通 Cookie 無 `HttpOnly` (防 XSS 竊取)、`Secure` (僅 HTTPS 傳輸)、`SameSite=Strict/Lax` (防 CSRF)、簽名/加密防篡改、過期時間、服務端會話存儲驗證。
- 無暴力破解防護: 無賬號鎖定、無驗證碼、無 IP 限流、無異常登錄告警。
安全重構最佳實踐 (ASP Classic / ASP.NET Core 通用原則)
1. 傳輸層強制 HTTPS
- IIS 綁定 443 端口,安裝有效 TLS 憑證 (Let's Encrypt/付費 OV/EV)。
- HTTP 301 重定向至 HTTPS;啟用 HSTS (`Strict-Transport-Security: max-age=31536000; includeSubDomains; preload`)。
2. 資料庫憑證安全存儲
- **嚴禁**在代碼/配置文件明文寫入連接字符串密碼。使用 **Azure Key Vault / HashiCorp Vault / AWS Secrets Manager / Windows DPAPI / 環境變量** 註入運行時。
- 數據庫賬號**最小權限**:Web 應用賃戶僅擁有業務表 `SELECT/INSERT/UPDATE/DELETE`,無 `DROP/ALTER/TRUNCATE`、`xp_cmdshell`、系統表訪問權限。
3. 密碼哈希存儲與驗證 (核心)
' 註冊/修改密碼時 - 服務端生成鹽值並哈希 (ASP Classic 需調用 COM 組件/ASP.NET 跨進程/第三方 DLL)
' 推薦算法:Argon2id > bcrypt > PBKDF2-SHA256 (迭代 ≥ 100,000)
' 存儲格式:$argon2id$v=19$m=65536,t=3,p=4$salt$hash
' 登錄驗證
Dim storedHash, inputPassword, isValid
storedHash = GetHashFromDB(username) ' 參數化查詢獲取
If storedHash <> "" Then
isValid = VerifyHash(inputPassword, storedHash) ' 常量時間比較防時序攻擊
End If
4. 參數化查詢 / 預編譯語句 — 徹底根治 SQL 注入
' ADO 參數化查詢示例
Dim cmd, rs, sql
sql = "SELECT pwd_hash, salt, user_id, status FROM users WHERE username = ?"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = sql
cmd.CommandType = 1 ' adCmdText
cmd.Parameters.Append cmd.CreateParameter("@username", 200, 1, 50, username) ' adVarChar, adParamInput, size
Set rs = cmd.Execute
**原則:永不拼接 SQL 字符串,所有用戶輸入均作為參數傳遞。**
5. 安全會話管理
- 登錄成功 → 生成 **高熵隨機 Session ID** (GUID/32字節隨機) → 服務端存儲 (內存/Redis/SQL Server Session State) 映射 `SessionID → UserID, Roles, Permissions, LoginTime, LastActivity, IP, UserAgent`。
- 設置 Cookie:`Response.Cookies("SessionID") = sessionId; Response.Cookies("SessionID").HttpOnly = True; Response.Cookies("SessionID").Secure = True; Response.Cookies("SessionID").SameSite = "Strict"` (ASP.NET: `web.config `)。
- 實現 **閒置超時 (20-30min)、絕對超時 (8h)、並發會話限制 (單用戶 1-3 個)、異地登錄踢出/告警、敏感操作二次認證 (MFA/短信/郵件/TOTP)**。
6. 登錄失敗防護
- 同一 IP/用戶 5 分鐘內失敗 ≥ 5 次 → 鎖定 15 分鐘 / 要求驗證碼 / 觸發告警。
- 記錄失敗日志 (IP、用戶名、時間、User-Agent、錯誤類型) 供 SIEM 分析。
- **統一錯誤提示**:「用戶名或密碼錯誤」,**不區分用戶不存在/密碼錯誤**,防用戶枚舉。
7. 多因子認證 (MFA) — 關鍵業務必備
- TOTP (Google Authenticator/Microsoft Authenticator/Authy) / 短信/郵件驗證碼 / FIDO2/WebAuthn 硬件鑰匙 / 推送確認。
- 管理員/特權賬號/敏感操作 (修改密碼/綁定手機/轉賬/權限變更) **強制 MFA**。
8. 代碼審計與上線檢查清單
- 靜態分析 (SonarQube, Fortify, Checkmarx, 國產掃描器) 掃描 SQLi、XSS、路徑遍歷、命令注入、邏輯漏洞。
- 動態掃描 (OWASP ZAP, Burp Suite, Acunetix) 針對登錄、表單提交、文件上傳、API 端點。
- 滲透測試 (內部紅隊/第三方) 覆蓋認證授權、業務邏輯、會話管理、加密實現。
經典 ASP 已停止主流維護 (Windows Server 2003 結束支持),**強烈建議遷移至 ASP.NET Core / Java Spring Boot / Node.js / Python Flask/Django / Go Gin 等現代框架**,內建參數化 ORM、身份認證中間件、HTTPS 強制、安全頭、依賴掃描、容器化部署,從架構層面消除整類漏洞。