일부 저장 프로 시저 프로 시저 입력 매개 변수가 제공된 경우 WHERE 조건을 보간해야합니다. 잠재적 주입 지점을 피하기 위해 보간 된 조건의 일부가 될 값에 대한 매개 변수 바인딩을 사용하고 싶습니다.바인딩 할 매개 변수 개수가 가변적 인 준비된 문 실행
준비된 명령문에 추가 된 조건과 바인드 할 매개 변수의 수는 사용자 입력에 따라 다를 수 있으므로 EXECUTE 문으로 전달할 변수를 결정하기 위해 아래 방법을 고안했습니다. 이것은 효과가 있지만 그것은 우아하지 않습니다.
CREATE PROCEDURE foo (IN mandatory INT, IN optional INT, IN optional2 VARCHAR(20))
BEGIN
SELECT
0, '', '', mandatory, optional, optional2
INTO
@params, @sql, @where, @m, @o1, @o2;
IF (@o1 > '' AND @o1 IS NOT NULL) THEN
SET @where = CONCAT(@where, ' AND field = ?');
SET @params = @params + 1;
END IF;
IF (@o2 > '' AND @o2 IS NOT NULL) THEN
SET @where = CONCAT(@where, ' AND field2 = ?');
SET @params = @params + 3;
END IF;
SET @sql = CONCAT('
SELECT id, bar FROM table
WHERE
baz = ?
', @where
);
PREPARE STMT FROM @sql;
CASE @params
WHEN 0 THEN EXECUTE STMT USING @m;
WHEN 1 THEN EXECUTE STMT USING @m, @o1;
WHEN 3 THEN EXECUTE STMT USING @m, @o2;
WHEN 4 THEN EXECUTE STMT USING @m, @o1, @o2;
END CASE;
DEALLOCATE PREPARE STMT;
END$$
나는 대안을 알고 있어요 :
- 이 스토어드 프로 시저를 호출 할 바이너리는 정규 표현식을 통해 사용자가 제공 한 문자열을 전달하여 잠재적 인 SQL 주입을 식별하기 위해 시도하는 기능을 가지고있다.
- 사용자 정의 함수를 사용하면 동적 입력 수가 주어진 경우 EXECUTE 문을 동적으로 생성 할 수 있습니다. 다른 사람이 욕망에 달려있다 사람이 SQL로 순전히 EXECUTE 문의 동적 구조를 처리하는 경우
그러나, 나는 궁금했다.