[研究][ASP.NET]防跨站腳本攻擊(Cross-Site Scripting, XSS)之陣列化參數化查詢(Array Parameterized Query)
2022-03-20
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
為了避免 跨站腳本攻擊(Cross-Site Scripting, XSS),目前都會要求使用 參數化查詢(Parameterized Query)。
但對大量的 T-SQL 命令需求時,將一堆 SQL 命令(分號分隔)放在一個 SQL String 中 (組字串),在一次連線中送給 SQL Server 執行,是比較有效率的,因為連線的建立和中斷是耗時的。
另外要注意,.NET 一次送給 SQL Server 的 SQL String 長度有限制,所以依據 SQL 命令長度,可能 1000 條或更少,就要送出執行一次;最後不足1000條的要再執行一次。
(直接在 SQL Server Management Studio (SSMS) 中可以一次執行很長 SQL String 是兩碼子事情)
要同時考慮 參數化查詢、大量 SQL 命令、效率,就要把參數以陣列處理,以陣列化參數化查詢(或其他方法)。
Default.asp.cs
using System; using System.Configuration; using System.Data.SqlClient; namespace WebApplication4 { public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string connectionString = ConfigurationManager.ConnectionStrings["TestDBConnectionString"].ConnectionString; string queryString = ""; string[] paraName = new string[5]; string[] paraValue = new string[5] { "1", "2", "3", "4", "5" }; for (int i = 0; i < paraName.Length; i++) { //paraName[i] = "@FieldText[" + i.ToString() + "]";//別用陣列當名稱,會失敗 paraName[i] = "@FieldText" + i.ToString() + ""; queryString = queryString + "INSERT INTO [dbo].[Table1] ([FieldText]) VALUES(" + paraName[i] + ");"; } using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(queryString, connection); command.Parameters.Clear(); for (int i = 0; i < paraName.Length; i++) command.Parameters.AddWithValue(paraName[i], paraValue[i]); command.Connection.Open(); command.ExecuteNonQuery(); } } } } |
(完)
相關
使用參數化查詢搭配 SqlDataSource (C#) | Microsoft Docs
https://docs.microsoft.com/zh-tw/aspnet/web-forms/overview/data-access/accessing-the-database-directly-from-an-aspnet-page/using-parameterized-queries-with-the-sqldatasource-cs
沒有留言:
張貼留言