programing

C#에서 SQL Server에 대해 단순한 SQL 쿼리를 이스케이프하는 방법

powerit 2023. 4. 19. 00:30
반응형

C#에서 SQL Server에 대해 단순한 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는 SQL Server를 데이터베이스로 사용합니다.

Sql Parameter를 사용하는 것은 옵션이 아니기 때문에 문자열 리터럴에서는 를 " " (2개의 작은 따옴표이며 하나의 큰 따옴표가 아닙니다)로 바꿉니다.바로 그겁니다.

다운보터 되기: 질문의 첫 줄을 다시 읽습니다.'파라미터 사용'도 직감적인 반응이었다.

편집: 예, SQL 주입 공격에 대해 알고 있습니다.만약 이 견적이 그것들에 취약하다고 생각되면, 제대로 된 반례를 제시해 주세요.아닌 것 같아요.

검색 기능을 위해 동적 sql(총 쏘는 소리가 들림)을 사용했지만, "오레일리"와 같은 성을 가진 사람을 검색할 때마다 끊어집니다.

회피책(해킹)을 찾아냈습니다.

SQL에 스칼라 값 함수를 생성하여 단일 따옴표를 2개의 작은 따옴표로 대체하여 문제를 일으키는 단일 따옴표를 효과적으로 제거했습니다.
"..." "Surname LIKE 'O'Reilly%" "그리고..." "가 됩니다"성은 '%O' 'Reilly%' 그리고..."

이 함수는 필드에 작은 따옴표(first name, last name)가 포함되어 있을 것으로 생각될 때마다 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에서는 기술적으로 매개 변수화된 쿼리를 사용하지만 ADO는 생략합니다.기본 SQL 코드의 순 추상화.

따라서 코드가 SQL 주입을 방지하지는 않지만, 최종 정답은 sp_executesql이지 SqlCommand가 아닙니다.

단, sp_executesql을 사용하는 SQL Injection-proof 스트링을 생성하기 위해서는 특별한 처리 요건이 있을 것입니다.

참조: 동적 SQL Stored Procedure에서 엔티티 프레임워크로 값을 반환하는 방법

심플:

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

반응형