首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

ASP.NET Forms 驗證整合 SQL Server 2000 完整實作:密碼雜湊、Salt、登入頁面與 Web.config 設定

     編輯:MySQL 資料庫相關知識

ASP.NET Forms 驗證允許使用者透過網頁表單輸入帳密進行身分驗證。本文完整示範如何在 SQL Server 2000 中安全儲存使用者憑證(SHA1 雜湊 + Salt),建立登入頁面、設定 Web.config、開發雜湊工具函數、建立使用者資料表與預存程序,打造完整的表單驗證方案。

核心安全原則

  • 不儲存明文密碼:僅儲存單向雜湊值。
  • 加入 Salt:每位使用者唯一隨機 Salt,抵禦彩虹表/字典攻擊。
  • 驗證使用者輸入:防止 SQL Injection,嚴格驗證帳號格式。
  • 密碼遺失無法恢復:需提供密碼提示或重設機制。

步驟 1:建立登入頁面

Visual Studio .NET → 新增 Visual C# ASP.NET Web 應用程式 FormsAuthSQL → 重命名 WebForm1.aspx 為 Logon.aspx → 加入控制項:

控制項文字ID
LabelUser Name:-
LabelPassword:-
TextBox-txtUserName
TextBox (TextMode=Password)-txtPassword
ButtonRegisterbtnRegister
ButtonLogonbtnLogon
Label-lblMessage

步驟 2:設定 Web.config 啟用 Forms 驗證

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="logon.aspx" name="sqlAuthCookie" timeout="60" path="/" />
    </authentication>
    <authorization>
      <deny users="?" />  <!-- 拒絕匿名用戶 -->
    </authorization>
  </system.web>
</configuration>

步驟 3:開發雜湊與 Salt 工具函數

using System.Security.Cryptography;
using System.Web.Security;

private static string CreateSalt(int size)
{
  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  byte[] buff = new byte[size];
  rng.GetBytes(buff);
  return Convert.ToBase64String(buff);
}

private static string CreatePasswordHash(string pwd, string salt)
{
  string saltAndPwd = String.Concat(pwd, salt);
  return FormsAuthentication.HashPasswordForStoringInConfigFile(saltAndPwd, "SHA1");
}

步驟 4:建立使用者資料庫與預存程序

-- 在 Query Analyzer 執行
CREATE DATABASE UserAccounts;
GO
USE UserAccounts;
GO

CREATE TABLE Users (
  UserID INT IDENTITY(1,1) PRIMARY KEY,
  UserName NVARCHAR(50) NOT NULL UNIQUE,
  PasswordHash NVARCHAR(100) NOT NULL,
  Salt NVARCHAR(50) NOT NULL,
  PasswordHint NVARCHAR(100) NULL
);
GO

CREATE PROCEDURE sp_RegisterUser
  @UserName NVARCHAR(50),
  @Password NVARCHAR(50),
  @Hint NVARCHAR(100)
AS
BEGIN
  DECLARE @Salt NVARCHAR(50) = dbo.fn_CreateSalt(8);  -- 需建立對應函數或應用層產生
  DECLARE @Hash NVARCHAR(100) = dbo.fn_CreateHash(@Password, @Salt);
  INSERT INTO Users (UserName, PasswordHash, Salt, PasswordHint)
  VALUES (@UserName, @Hash, @Salt, @Hint);
END;
GO

CREATE PROCEDURE sp_ValidateUser
  @UserName NVARCHAR(50),
  @Password NVARCHAR(50)
AS
BEGIN
  DECLARE @Salt NVARCHAR(50), @Hash NVARCHAR(100);
  SELECT @Salt = Salt, @Hash = PasswordHash FROM Users WHERE UserName = @UserName;
  IF @Hash IS NOT NULL AND @Hash = dbo.fn_CreateHash(@Password, @Salt)
    SELECT 1 AS Valid;  -- 成功
  ELSE
    SELECT 0 AS Valid;  -- 失敗
END;
GO
實務補充: 生產環境建議改用 PBKDF2、bcrypt 或 Argon2(需 CLR 整合或應用層運算),SHA1 已不建議用於新系統密碼雜湊。

步驟 5:登入按鈕事件程式碼

protected void btnLogon_Click(object sender, EventArgs e)
{
  string user = txtUserName.Text.Trim();
  string pwd = txtPassword.Text;
  
  // 輸入驗證(防 SQL Injection)
  if (!Regex.IsMatch(user, @"^[\w@.-]{1,50}$")) {
    lblMessage.Text = "帳號格式錯誤";
    return;
  }

  // 呼叫預存程序驗證
  using (SqlConnection conn = new SqlConnection(connStr))
  using (SqlCommand cmd = new SqlCommand("sp_ValidateUser", conn)) {
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("@UserName", user);
    cmd.Parameters.AddWithValue("@Password", pwd);
    conn.Open();
    int valid = (int)cmd.ExecuteScalar();
    if (valid == 1) {
      FormsAuthentication.RedirectFromLoginPage(user, false);
    } else {
      lblMessage.Text = "帳號或密碼錯誤";
    }
  }
}

部署檢核清單

  • [ ] Web.config 設定 authentication mode="Forms" 且 deny users="?"。
  • [ ] 密碼欄位 TextMode="Password",傳輸採 HTTPS。
  • [ ] 所有 SQL 參數化,無字串拼接。
  • [ ] 雜湊演算法升級規劃(SHA1 → PBKDF2/bcrypt)。
  • [ ] 密碼重設流程(Email 連結 + 時效性 Token)。

遵循「雜湊 + Salt + 參數化 + HTTPS」四大原則,即可建立相對安全的 Forms 驗證系統,保護使用者憑證不外洩。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved