2022年3月20日 星期日

[研究][ASP.NET]防跨站腳本攻擊(Cross-Site Scripting, XSS)之陣列化參數化查詢(Array Parameterized Query)

[研究][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


沒有留言:

張貼留言