簡體   English   中英

您只能參數化where子句嗎?

[英]Can you only parameterize the where clause?

為了防止sql注入,我嘗試使用參數化查詢。 但是我不清楚我是否應該僅參數化where子句或查詢的其他部分。 例如,我正在嘗試改善以下查詢:

string strQ = @";WITH lstTable as (
                SELECT ROW_NUMBER() OVER(ORDER BY " + sort + @") AS RowNum, *
                FROM (
                SELECT *
                FROM SystemMessage
                WHERE Deleted = 0  ";`

該查詢正在網格中使用,並根據用戶的選擇,將按列名進行排序。 在這種情況下,我是否需要對'sort'進行參數化?

您是正確的,您不能為此用例直接使用參數。 但是,是否需要使用參數的事實取決於如何填充sort

如果這是一個經過硬編碼的列名列表,而用戶只是選擇要選擇列表中的哪些索引,則不必擔心參數化,用戶在查詢中沒有直接輸入,因此他們可以不要向其中注入代碼。

如果用戶直接提供列名,則必須在傳遞用戶輸入之前清除用戶輸入,一種方法是使用sql函數QUOTENAME清除輸入。

string strQ = @"
declare @query nvarchar(max)
set @query = ';WITH lstTable as (
                SELECT ROW_NUMBER() OVER(ORDER BY' + QUOTENAME(@sortColumn) + ') AS RowNum, *
                FROM (
                SELECT *
                FROM SystemMessage
                WHERE Deleted = 0 '
exec sp_executesql @query";

所要做的就是傳遞給@sortColumn任何字符串,它將在該字符串值周圍正確包裹[ ] 然后,它將在動態生成的字符串中使用該概括值,並使用sp_executesql運行該值。

一個重要的注意事項,該示例當前僅適用於單個列名,您需要一個QUOTENAME以及要添加到查詢中的每個列的新參數。 如果您確實嘗試傳入FirstName, LastName ,它將變成

;WITH lstTable as (
   SELECT ROW_NUMBER() OVER(ORDER BY [FirstName, LastName]) AS RowNum, *
       FROM (
       SELECT *
       FROM SystemMessage
       WHERE Deleted = 0

當執行時,它將嘗試查找名為“ [FirstName, LastName] ”的列[FirstName, LastName]並且將失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM