首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

ASP.NET SqlException「列名 'zz' 無效」:SQL 拼接注入風險與參數化修正

     編輯:程式設計綜合問答

錯誤堆棧

System.Data.SqlClient.SqlException: 列名 'zz' 無效。
...
string sql1 = "select * from XX where Name=" + Session["name"] + "";

根因

  • SQL 字符串拼接缺少引號:Name=zz 被解析為列名比較,而非字符串值。
  • Session["name"] 為 zz 時,生成 SQL:select * from XX where Name=zz,數據庫以為 zz 是列名。
  • 極大的 SQL 注入風險。

修正代碼(參數化查詢)

string sql = "select * from XX where Name=@name";
using (SqlConnection conn = sc.getSqlConnection()) {
    conn.Open();
    using (SqlCommand cmd = new SqlCommand(sql, conn)) {
        cmd.Parameters.AddWithValue("@name", Session["name"]);
        using (SqlDataReader dr = cmd.ExecuteReader()) {
            if (dr.Read()) {
                Label11.Text = dr["Nicename"].ToString();
                Label12.Text = dr["Sex"].ToString();
                Label13.Text = dr["PhoneNumber"].ToString();
                Label14.Text = dr["Email"].ToString();
            }
        }
    }
}

關鍵點

  1. 永遠使用參數化查詢,避免拼接。
  2. dr.GetString(dr.GetOrdinal(...)) 可簡化為 dr["col"].ToString()。
  3. 調試時輸出最終 SQL(cmd.CommandText 參數值不會顯示,可自行記錄)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved