Microsoft SQL Server
동적 SQL
수색…
문자열로 제공되는 SQL 문 실행
경우에 따라 문자열에 SQL 쿼리를 배치해야합니다. EXEC, EXECUTE 또는 시스템 프로 시저 sp_executesql은 string으로 제공된 모든 SQL 쿼리를 실행할 수 있습니다.
sp_executesql N'SELECT * FROM sys.objects'
-- or
sp_executesql @stmt = N'SELECT * FROM sys.objects'
-- or
EXEC sp_executesql N'SELECT * FROM sys.objects'
-- or
EXEC('SELECT * FROM sys.columns')
-- or
EXECUTE('SELECT * FROM sys.tables')
이 프로시 저는 명령문 텍스트로 제공된 SQL 조회와 동일한 결과 세트를 리턴합니다. sp_executesql은 문자열 리터럴, 변수 / 매개 변수 또는 심지어 표현식으로 제공된 SQL 쿼리를 실행할 수 있습니다.
declare @table nvarchar(40) = N'product items'
EXEC(N'SELECT * FROM ' + @table)
declare @sql nvarchar(40) = N'SELECT * FROM ' + QUOTENAME(@table);
EXEC sp_executesql @sql
@table 변수에서 특수 문자를 이스케이프하려면 QUOTENAME 함수가 필요합니다. @table 변수에 공백, 대괄호 또는 다른 특수 문자가 포함되어 있으면이 함수가 없으면 구문 오류가 발생합니다.
다른 사용자로 실행되는 동적 SQL
AS 사용자 = '데이터베이스 사용자의 이름'을 사용하여 다른 사용자로 SQL 쿼리를 실행할 수 있습니다.
EXEC(N'SELECT * FROM product') AS USER = 'dbo'
SQL 쿼리는 dbo 데이터베이스 사용자에서 실행됩니다. dbo 사용자에게 적용되는 모든 권한 검사는 SQL 쿼리에서 검사됩니다.
동적 SQL을 이용한 SQL 삽입
동적 검색어는
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = ''' + @user + ''' AND Password = ''' + @pass + ''''
EXEC(@sql)
user 변수의 값이 myusername ''OR 1 = 1 - 인 경우 다음 쿼리가 실행됩니다.
SELECT COUNT(*)
FROM AppUsers
WHERE Username = 'myusername' OR 1=1 --' AND Password = ''
변수 @username의 값 끝 부분에있는 주석은 쿼리의 후행 부분을 주석 처리하고 조건 1 = 1이 평가됩니다. 이 쿼리로 반환 된 하나 이상의 사용자가 거기에서 확인하는 응용 프로그램은 0보다 큰 개수를 반환하고 로그인이 성공합니다.
이 방법을 사용하면 공격자는 유효한 사용자 이름과 암호를 알지 못하더라도 응용 프로그램에 로그인 할 수 있습니다.
매개 변수가있는 동적 SQL
주입 및 이스케이프 문제를 피하기 위해 동적 SQL 쿼리는 다음과 같은 매개 변수를 사용하여 실행해야합니다.
SET @sql = N'SELECT COUNT(*) FROM AppUsers WHERE Username = @user AND Password = @pass
EXEC sp_executesql @sql, '@user nvarchar(50), @pass nvarchar(50)', @username, @password
두 x 째 매개 변수는 유형과 함 2 조회에 사용되는 매개 변수 목록으로,이 목록 뒤에는 매개 변수 값으로 사용될 변수가 제공됩니다.
sp_executesql은 특수 문자를 이스케이프 처리하고 SQL 쿼리를 실행합니다.