2009-08-13 3 views
12

Flex를 통해 AIR에서 응용 프로그램을 개발 중이지만 SQLite에서 어디서 잘못 될지 알 수 없습니다 (MySQL에 익숙합니다). 매개 변수는 작동하지만 특정 경우에만 가능합니다. 이 부분이 SQL 인젝션에 대비되는 위생 시스템의 일부입니까? 어떤 도움을 주셔서 감사합니다!SQLite 매개 변수 - tablename을 매개 변수로 허용하지 않습니다.

작품 :

SQLite는

"INSERT : 장르 FROM 필드", 매개 변수는 다음과 같습니다 필드 = "*"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

마 esn't 작업 (AT SQL 구문 오류 "표")

SQLite는

"INSERT : 분야 표"필드 = "*"및 다음 매개 변수는 표 = "분류"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

답변

30

일반적으로 에 대해 SQL 매개 변수/자리 표시자를 사용할 수 없습니다. (테이블, 열,보기, 스키마 등) 또는 데이터베이스 기능 (예 : CURRENT_DATE)을 사용하는 대신 리터럴 값을으로 바인딩하는 경우에만 사용할 수 있습니다.

매개 변수화 된 (일명 준비된) 문에 대한 서버 측 지원을 사용하면 DB 엔진이 바인딩 할 매개 변수 (유형, 최대 길이, 정밀도 등)의 특성을 기억하여 쿼리를 한 번 구문 분석합니다 이미 구문 분석 된 쿼리의 후속 실행에서 그러나 데이터베이스 객체와 같은 중요한 비트가 알려지지 않은 경우 쿼리를 구문 요소로 올바르게 구문 분석 할 수 없습니다.

그래서 일반적으로 테이블 이름 자체는 스토어드 프로 시저 또는 클라이언트 코드에서 테이블 이름을 적절히 대체해야합니다.이 코드는 적절히 실행될 SQL 문을 동적으로 concat/interpolates/whatevers합니다. 어쨌든 데이터베이스 식별자을 인용하면 에 대한 SQL API 함수를 사용하십시오. API는 사용자를 대신하지 않습니다.

+1

첫 단락에 나와 있습니다. – Lucky

-1

이 동일하지만 자바에서 비슷한 가로 질러 확실하지. 당신이 그렇게 같은 문 생성해야하므로 기본적으로 당신은 매개 변수로 테이블을 추가 할 수 없습니다 :

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

를 추가하기 전에 데이터의 일부 사용자 지정 유효성 검사를 할 수 있습니다, 그래서이 아닌 가장 안전한 솔루션 대부분은 가능성이 높습니다 테이블 이름 .. 누군가가 테이블 이름 "; drop tableName ..."을 보내려고 시도하지 않습니다.