문제

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과 동일해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top