簡體   English   中英

如何在C#中為SqlServer轉義簡單的SQL查詢

[英]How to escape simple SQL queries in C# for SqlServer

我使用了一個需要SQL字符串的API。 我接受用戶輸入,將其轉義並將其傳遞給API。 用戶輸入非常簡單。 它要求列值。 像這樣:

string name = userInput.Value;

然后我構造一個SQL查詢:

string sql = string.Format("SELECT * FROM SOME_TABLE WHERE Name = '{0}'",
                           name.replace("'", "''"));

這樣安全嗎? 如果不是,是否有一個簡單的庫函數可以使列值安全:

string sql = string.Format("SELECT * FROM SOME_TABLE WHERE Name = '{0}'",
                           SqlSafeColumnValue(name));

API使用SQLServer作為數據庫。

由於使用SqlParameter不是一個選項,只需在字符串文字中替換'with''(兩個單引號,而不是一個雙引號)。 而已。

對於潛在的貶低者:重新閱讀問題的第一行。 “使用參數”也是我的直覺反應。

編輯:是的,我知道SQL注入攻擊。 如果您認為這種引用容易受到引用,請提供一個有效的反例。 我認為不是。

我正在使用動態sql(我可以聽到射擊小隊加載他們的步槍)用於搜索功能,但每當用戶搜索姓氏為“O'Reilly”的人時,它就會中斷。

我設法解決了一個解決方法(讀“hack”):

在sql中創建了一個標量值函數,用兩個單引號替換單引號,有效地轉義了違規的單引號,所以
“...喜歡姓'%O'Reilly%'和......”變成“......喜歡'%O''Reilly%'和......”

每當我懷疑字段可能包含單引號字符時,就會從sql中調用此函數,即:firstname,lastname。

CREATE FUNCTION [dbo].[fnEscapeSingleQuote]
    (@StringToCheck NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)
    SELECT @Result = REPLACE(@StringToCheck, CHAR(39), CHAR(39) + CHAR(39))
    RETURN @Result
END

不是很優雅或高效,但是當你處於緊張狀態時它會起作用。

當需要在短時間內解決大量ad hoc sql中的問題時,可能希望替換“with”而不是參數化,同時將破壞和最小測試的風險降至最低。

SqlCommand和Entity Framework使用exec sp_executesql...

所以真的有一種原始字符串的替代方法,可能有你自己的轉義模式。 使用SqlCommand,您在技術上使用參數化查詢,但是您繞過了底層SQL代碼的ADO.Net抽象。

因此,雖然您的代碼不會阻止SQL注入,但最終的答案是sp_executesql而不是SqlCommand。

話雖如此,我確信生成一個使用sp_executesql的SQL注入證明字符串有特殊的處理要求。

請參閱: 如何將值從動態SQL存儲過程返回到實體框架?

最好使用sql參數,但是你有2300個參數限制查詢。 在大多數情況下,這將是綽綽有余的。 但在極少數情況下,當您超過此限制時,我認為這是一個選項。

簡單:

const string sql = "SELECT * FROM SOME_TABLE WHERE Name = @name";

並使用值添加@name參數:

cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@name", name);

如果您需要為MSSQL查詢轉義字符串,請嘗試以下操作:

System.Security.SecurityElement.Escape(Value)

暫無
暫無

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

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