쿼리라는 이름의 최대 절전 모드로 테이블 이름 문제
-
16-09-2019 - |
문제
Hibernate에서 다음과 같은 이름의 쿼리가 있습니다.
<sql-query name="CreateLogTable">
CREATE TABLE IF NOT EXISTS :tableName (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`url` VARCHAR (750) NOT NULL,
`query` VARCHAR (500),
`ipaddress` VARCHAR (39),
`datetime` DATETIME NOT NULL,
`hits` MEDIUMINT UNSIGNED DEFAULT '0' NOT NULL,
`path_id` VARCHAR (8),
PRIMARY KEY(`id`),
UNIQUE(`id`),
INDEX(`id`,`query`,`datetime`,`path_id`)
) TYPE = MyISAM
</sql-query>
그런 다음 다음 줄을 사용 하여이 줄을 실행하려고합니다 (상수는 항목을 올바르게 포인트하는 것) :
getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "wibble").executeUpdate();
이제 코드를 실행하면 인용문으로 둘러싸인 테이블 이름과 관련하여 SQL 오류가 발생합니다.
CREATE TABLE IF NOT EXISTS 'wibble' (
생성 된 쿼리를 가져 와서 테이블 이름 주변의 따옴표없이 시도하면 쿼리가 제대로 작동합니다. 내 문제를 일으키는 인용문 일뿐입니다.
그래서 내 질문은 : 대신 무엇을 사용해야합니까? setString
내 매개 변수가 따옴표로 둘러싸여 있지 않도록하기 위해? 난 노력 했어 setParameter
운이없고 API에서 더 나은 대안을 발견 할 수 없었습니다.
입력 해 주셔서 감사합니다
해결책
테이블 이름과 같은 데이터베이스 식별자에 명명 된 매개 변수를 사용할 수 있다고 생각하지 않습니다. 가치 표현 만. 허용 된 경우 SQL 주입 공격에 취약 해집니다. 대안으로 Java에서 쿼리를 구성 할 수 있습니다.
다른 팁
어떤 데이터베이스 유형을 사용하고 있습니까? 일부 데이터베이스는 사례에 민감합니다 (실제로는 대부분 Microsoft를 제외하고). 따라서 'Wibble'이라는 테이블은 'Wibble'과 다르며 여전히 'Wibble'과 다릅니다.
인용문이없는 wibble이라는 테이블을 만들 때 Oracle과 같은 대부분의 데이터베이스는 이것을 모든 Caps 'wibble'에서 명명 된 테이블로 만듭니다. 쿼리하면 여기에서와 같이 사용합니다.
SELECT * FROM wibble
데이터베이스는 이것을 'wibble'으로 해석 할 것이며 아무런 문제가 없습니다.
지속성 제공 업체는 항상 이것을 인용문으로 넣는 것 같습니다. 인용 된 이름을 만든 것과 동일하게 만들려면 대문자를 사용해야합니다. 그러니 이것을 시도하십시오 :
getSession().getNamedQuery(CREATE_SQL).setString(CREATE_SQL_TABLE_NAME_PARAM, "WIBBLE").executeUpdate();
그것은 'wibble'으로 진술을 만들어야하며, 이는 인용문이없는 wibble과 동일해야합니다.