찾고있는 기능은 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'이는 임의의 코드가 실행됩니다. 테이블을 삭제했거나 권한을 부여했을 수 있습니다 .'-- '.