2014-02-21 2 views
0

으로 가능한 SQL volnurability를 해결하려고합니다. 해결책 중 하나는 인코딩을 추가하여 쿼리를 변경하는 것입니다. EX : "select * from address where city='bellevue' "은 (는) "select * from address where city=''bellevue'' "으로 바뀝니다. 그 쿼리는 예외를 던졌습니다 : java.sql.SQLException:[SQL0101]Token bellevue was not valid. Valid tokens:FOR....오라클, 는 동일한 유형의 쿼리를 실행하는 데 문제가없는 것 같지만 DB2/AS400은 좋지 않습니다. 쿼리는 하나의 '' '만으로도 효과적입니다. JDBC을 사용하여 드라이버 연결 : com.ibm.as400.access.AS400JDBCDriver. 왜 그런가?db2/AS400 SQLException 토큰이 유효하지 않음

+0

Q : 작은 따옴표 (')를 사용할 수 있습니까? 맞습니까? 그렇다면 문제가 무엇입니까? – FoggyDay

+0

정확하고 작은 따옴표가 올바르게 작동합니다. 사용자의 입력을 이스케이프 처리하여 쿼리를 보호하려고합니다 (링크 : https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 참조). 완벽한 솔루션은 PreparedStatement를 사용하는 것이지만, 우리의 경우 쿼리는 사용자가 입력하여 생성하므로 쿼리를 파싱하고 PreparedStatement를 생성하는 것은 약간의 비용이 듭니다. 탈출은 또 다른 방법이며, 이것이 우리가 작은 따옴표를 2 개의 작은 따옴표로 바꾸는 이유입니다. – galina62

답변

0

SQL 삽입을 방지하려고합니다. 하나의 아포스트로피 (')를 두 개의 아포스트로피 ('')로 바꿔야한다는 생각이 들었습니다. 그러나 그들은 사용자의 입력 내용에 대해서만 말하고 주변에는 들어 가지 않았습니다.

그런 공격이 어떻게 작동하는지 살펴 보겠습니다. 사용자에게 도시 이름을 입력 할 필드를 제공합니다. 해당 값을 쿼리에 사용하려고합니다.

query := "select * from address where upper(city)=upper('" || input_city || ")'" 

그리고이 쿼리 문자열을 데이터베이스 서버가 해석하도록 보냅니다. bellvue 또는 을 입력하면 문제가 없습니다. 그러나 그들이 Washington's Crossing을 입력하면 문제가 발생하면 어떻게되는지 생각해보십시오. 쿼리 문자열의 첫 번째 부분은 아포스트로피로 끝나서 문자열 리터럴을 시작하지만 도시 이름의 아포스트로피가 리터럴을 끝내고 s Crossing은 구문 오류를 발생시킵니다.

누군가이 사실을 알고 자신의 의견을 통해 창의력을 발휘하면 어떻게 될지 상상해보십시오. 몇 가지를 살펴 보겠습니다.

x' or '1'='1 
'; select * from tablescatalog where table_name >' 
'; delete from customers where name<>' 

또는 악화 될 수있는 다른 값. 이제 동적으로 쿼리를 작성할 때 특별한주의가 필요한 입력 필드 인 이유를 알 수 있습니다. 당신은 당신의 쿼리 문자열에서 그것을 사용하기 전에 유명한 문자들을 처리 할 필요가 있습니다.

매개 변수화 된 쿼리를 준비 할 수도 있습니다. 이것은 일반적으로 더 안전한 방법입니다. 그것은 훨씬 더 잘 수행됩니다.

+0

[만화] (https://xkcd.com/327/) 및 [설명] (http://www.explainxkcd.com/wiki/index.php/Little_Bobby_Tables) – WarrenT

+0

답장을 보내 주셔서 감사합니다. 매개 변수화 된 쿼리를 사용하는 PrepareStatement가 더 안전하고 잘 수행된다는 점에 동의합니다. 우리의 응용 프로그램에서는 사용자가 실제로 WHERE 절을 입력 할 수 있습니다 (사용자는 WHERE CITY = 'BELLEVUE'를 입력합니다). 사용자 입력을 매개 변수화 된 쿼리로 변환하는 오픈 소스 제품을 알고 계십니까? SQL Parser를보고 있었지만 상용 제품입니다. – galina62

+0

매개 변수의 장소 표시 자로 물음표와 함께 쿼리를 제공합니다. 이 명령문을 준비한 다음 사용자 입력을 매개 변수 값으로 제공하여 커서를 실행합니다 (또는 커서로 여는 경우). 이미 준비되었으므로 구문이 이미 결정되었습니다. 사용자의 입력은 다른 것으로 해석 될 수 없습니다. – WarrenT

관련 문제