programing

SqlServer 용 C #에서 간단한 SQL 쿼리를 이스케이프하는 방법

nasanasas 2020. 10. 27. 08:17
반응형

SqlServer 용 C #에서 간단한 SQL 쿼리를 이스케이프하는 방법


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를 사용하는 것은 옵션이 아니므로 문자열 리터럴에서 '를' '(즉, 큰 따옴표 하나가 아니라 작은 따옴표 두 개)로 바꾸십시오. 그게 다야.

반대 투표자가 되려면 질문의 첫 번째 줄을 다시 읽으십시오. "매개 변수 사용"도 내 직감 반응이었습니다.

편집 : 예, SQL 주입 공격에 대해 알고 있습니다. 이 인용문이 그들에게 취약하다고 생각되면 작동하는 반례를 제공하십시오. 나는 그렇지 않다고 생각합니다.


검색 기능을 위해 동적 SQL (소총을 장전하는 발사대 소리를들을 수 있음)을 사용하고 있었지만 사용자가 "O'Reilly"와 같은 성을 가진 사람을 검색 할 때마다 깨질 것입니다.

해결 방법을 알아 냈습니다 ( "해킹"읽기).

작은 따옴표를 두 개의 작은 따옴표로 대체하여 문제가되는 작은 따옴표를 효과적으로 이스케이프 처리하여
"... Surname LIKE '% O'Reilly %'AND ..."가 "... Surname이 되는 스칼라 값 함수를 SQL에 생성했습니다 . LIKE '% O''Reilly %'AND ... "

이 함수는 필드에 작은 따옴표 문자 (예 : 이름, 성)가 포함될 수 있다고 의심 될 때마다 SQL 내에서 호출됩니다.

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

그다지 우아하거나 효율적이지는 않지만 꼬집었을 때 작동합니다.


파손 위험을 최소화하고 테스트를 최소화하면서 단시간에 대량의 임시 SQL에서 '문제를 해결해야하는 경우 매개 변수화 대신'를 ''로 대체 할 수 있습니다.


SqlCommand 및 Entity Framework는 exec sp_executesql....

따라서 아마도 자신의 이스케이프 패턴을 가진 원시 문자열에 대한 대안이 있습니다. SqlCommand를 사용하면 기술적으로 매개 변수화 된 쿼리를 사용하지만 기본 SQL 코드의 ADO.Net 추상화를 우회합니다.

따라서 코드가 SQL 주입을 방지하지는 않지만 궁극적 인 대답은 SqlCommand가 아닌 sp_executesql입니다.

하지만 sp_executesql을 활용하는 SQL 주입 방지 문자열을 생성하기위한 특별한 처리 요구 사항이 있다고 확신합니다.

참조 : 동적 SQL 저장 프로 시저에서 Entity Framework로 값을 반환하는 방법은 무엇입니까?


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)

참고 URL : https://stackoverflow.com/questions/2403681/how-to-escape-simple-sql-queries-in-c-sharp-for-sqlserver

반응형