2012-06-21 2 views
1

이 같은 SQL 쿼리에서 일부 매개 변수를 사용하려고합니다.SQL 테이블 매개 변수화가 허용되지 않습니까?

Answer_table = new MySqlParameter("@answerTable", AT); 
    MySqlCommand solved_q = new MySqlCommand("SELECT * FROM @answerTable WHERE UserID = @uID", c2.get_con()); 
    solved_q.Parameters.Add(Answer_table); 
    solved_q.Parameters.Add(uID); 

하지만 예상대로 작동하지 않습니다. 그것은 허용되지 않기 때문에 테이블 이름 (@answerTable)에 대한 매개 변수를 사용하지 않을 때 uID에 대해 작동합니까? 만약 그렇다면 다른 방법이 있습니까?

어떤 도움을 주시면 감사하겠습니다 :) 당신은 매개 변수를 사용하여 FROM 절을 지정할 수 없습니다

+0

중복 : http://stackoverflow.com/questions/6041496/mysqlparameter-as-tablename – manji

+1

SQL 문의 from 부분의 매개 변수는 허용되지 않습니다. 매개 변수를 사용하는 대신 문자열에 연결해야합니다. 테이블 이름이 사용자 입력과 연결되어 있으면 SQL 주입 공격으로부터 보호하기 위해 적절한 이스케이프 처리를 수행해야합니다. – JamieSee

+0

@JamieSee 또는 [이 답변] (http://stackoverflow.com/a/6041545/119477)에서 제안 된 vimvq1987로서'@ answertable'의 값이 실행 전에 DB에 있는지 확인할 수 있습니다. –

답변

2

DBMS가 준비된 명령문의 실행 경로를 컴파일하기 위해 필요한 정보의 일부이기 때문에 허용되지 않습니다.

준비하기 전에 런타임에 문을 런타임에 문자열로 작성해야합니다. 다행히 대부분의 DBMS는 여전히 준비된 캐시를 캐시합니다.

중요 사항 : 어떤 식 으로든 테이블 이름이 "외부에서"오는 경우 (예 : HTML 요청의 매개 변수) SQL 주입을 피하려면 매우 조심해야합니다 (예 : 누군가가 뭔가를 전달할 수 있음). "table1; drop table table1"처럼 예상치 못한 방식으로 SQL 문의 의미를 변경합니다.

+0

+1. 난 전적으로 동의합니다. –

3

.

당신은 실제 문자열을 구축하여 SQL 문을 생성 할 수 있습니다 :

new MySqlCommand(String.Format("SELECT * FROM {0} WHERE UserID = @uID" 
       , answertable) 
       , c2.get_con()); 

주 - ansertable 변수의 조작을 허용하지 않음으로써 SQL 주입 공격을 방지해야합니다.

+0

+1. 예, 어쨌든 알려진 테이블 이름 만 허용합니다. –

0

AT 이후

MySqlCommand solved_q = new MySqlCommand(
    String.Format("SELECT * FROM {0} WHERE UserID = @uID", AT), 
    c2.get_con()); 
solved_q.Parameters.AddWithValue("@uID", uID); 

프로그래밍 결정하십시오 (I 희망)과 사용자가 입력하지, 당신은 여기에 SQL 주입 문제가되지 않습니다.

0

당신은 SELECT를하고있어 새로운 테이블을 만들지는 않을 것입니다 ... 쿼리 할 때 db에있는 테이블은 이미 알려져 있습니다. 유효한 테이블 목록을 db에 쿼리하여이 사실을 활용하십시오. 먼저 목록을 작성한 다음 제공된 tablename의 유효성을 검사하여 온 전성을 확인하십시오. 유효한 목록에 있으면 문자열을 만들어 db에 대해 실행합니다.

관련 문제