SQL Server와 함께 동적 SQL에서 식별자를 인용하는 함수는 무엇입니까?


11

동적 SQL 생성을위한 안전한 인용 식별자의 SQL Server 방법은 무엇입니까?

열 자체가 SQL 인젝션 공격이 아니라는 동적으로 생성 된 명령문에 대해 동적으로 생성 된 열 이름을 제공하려면 어떻게해야합니까?

SQL 문이 있다고 가정 해 봅시다.

SELECT [$col] FROM table;

본질적으로

'SELECT [' + $col + '] FROM table;'

주입 공격을 중지시키는 곳

$col = "name] FROM sys.objects; \r\n DROP TABLE my.accounts; \r\n\ --";

를 야기하는

SELECT [name] FROM sys.objects;
DROP TABLE my.accounts;
-- ] FROM table;

답변:


14

찾고있는 기능은 QUOTENAME!

대괄호 기술을 실제로 사용하면 문자열을 안전하게 캡슐화하여 핫 SQL 인젝션 공격을 방지 할 수 있습니다.

뭔가 대괄호를 고집 참고 않습니다 하지 당신이 개체 이름에 잘못된 문자 erroring 코드를 피할 수 있지만 안전하게, 그것을 인용.

좋은 코드

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT ' + QUOTENAME(d.name) + ' FROM your_mom'
FROM sys.databases AS d

잘못된 코드

DECLARE @sql NVARCHAR(MAX) = N''
SELECT @sql = 'SELECT [' + d.name + '] FROM your_mom'
FROM sys.databases AS d

구체적인 예를 들자면 ...

다음은 초기 입력에 적합합니다.

DECLARE @ObjectName SYSNAME = 'sysobjects';

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT COUNT(*) FROM [' + @ObjectName + ']';

EXEC (@dynSql);

그러나 악의적 인 입력의 경우 SQL 주입에 취약합니다.

DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT  COUNT(*)  FROM [' + @ObjectName + ']';

EXEC (@dynSql);

QUOTENAME올바르게 사용 하면 포함 된 이스케이프되고 ]시도 된 SQL 삽입이 발생하지 않습니다.

DECLARE @ObjectName SYSNAME = 'sysobjects];SELECT ''This is some arbitrary code executed. It might have dropped a table or granted permissions''--'

DECLARE @dynSql NVARCHAR(MAX) = 'SELECT  COUNT(*)  FROM ' + QUOTENAME(@ObjectName);

EXEC (@dynSql);

잘못된 개체 이름 'sysobjects]; SELECT'이는 임의의 코드가 실행됩니다. 테이블을 삭제했거나 권한을 부여했을 수 있습니다 .'-- '.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.