sql - 탐지 - 인젝션 뜻




열이 존재하는지 여부에 따라 SQL 삽입 (3)

SQL은 컬럼이 존재하지 않으므로 조회를 실행할 수 없게됩니다. 해결책은 동적 쿼리를 실행하는 것입니다.

DECLARE @value1 AS VARCHAR(50)
DECLARE @value2 AS VARCHAR(50)
DECLARE @value3 AS VARCHAR(50)
DECLARE @value4 AS VARCHAR(50)

SET @value1 = 'somevalue1'
SET @value2 = 'somevalue2'
SET @value3 = 'somevalue3'
SET @value4 = 'somevalue4'

DECLARE @SQL AS VARCHAR(MAX)

IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
    BEGIN

        SET @SQL = 
            'INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
            SELECT ' + @value1 + ', ' + @value2 + ', ' + @value3 + ', ' + @value4 
    END 
ELSE
    BEGIN

        SET @SQL = 
            'INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
            SELECT ' + @value1 + ', ' + @value3 + ', ' + @value4 
    END

EXEC(@SQL)

동일한 테이블의 서로 다른 버전으로 인해 열이 존재하는지에 따라 하나의 INSERT 또는 다른 작업을 수행해야합니다.

이 스레드 에서 접근법을했지만 SQL Server의 사전 검사 또는 '일종의 컴파일'이 실행 시간 동안 실패하지 않는 오류를 감지합니다.

여기에 몇 가지 코드가 있습니다.

IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
BEGIN

INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
SELECT value1, value2, value3, value4

END ELSE
BEGIN

INSERT INTO [dbo].[TableA]([Column1], [Column3], [Column4])
SELECT value1, value3, value4

END

해결 방법은 없습니까?


이것을 동적으로 접근하는 대신 공통 서명을 사용하여 저장 프로 시저를 만들고 다양한 버전의 데이터베이스에 적절한 버전을 추가합니다.

예 :

create proc TableAInsert
(
     @col1 int,
     @col2 int,
     @col3 int,
     @col4 int
)

이런 식으로 데이터베이스의 interface 정의를 작성합니다.

데이터베이스가 다시 변경되면 선택적 매개 변수를 기본값으로 사용하여이 프로 시저의 새 버전을 작성한 다음 이전과 동일한 방법으로 호출 할 수 있습니다.


    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS
        WHERE TABLE_NAME = 'TABLEA' AND COLUMN_NAME = 'COLUMNNAME')
       BEGIN
    IF COL_LENGTH('TableA', 'Column2') IS NOT NULL
       BEGIN
    INSERT INTO [dbo].[TableA]([Column1], [Column2], [Column3], [Column4])
    SELECT value1, value2, value3, value4

열의 존재 여부를 확인하고 길이가 있는지 확인하십시오. 그러나 나는 COL_LENGTH 로 검사하는 데 COL_LENGTH 잘못된 것을 COL_LENGTH .

희망이 도움이됩니다.





sql-server