으로 가능한 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 토큰이 유효하지 않음
답변
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<>'
또는 악화 될 수있는 다른 값. 이제 동적으로 쿼리를 작성할 때 특별한주의가 필요한 입력 필드 인 이유를 알 수 있습니다. 당신은 당신의 쿼리 문자열에서 그것을 사용하기 전에 유명한 문자들을 처리 할 필요가 있습니다.
매개 변수화 된 쿼리를 준비 할 수도 있습니다. 이것은 일반적으로 더 안전한 방법입니다. 그것은 훨씬 더 잘 수행됩니다.
[만화] (https://xkcd.com/327/) 및 [설명] (http://www.explainxkcd.com/wiki/index.php/Little_Bobby_Tables) – WarrenT
답장을 보내 주셔서 감사합니다. 매개 변수화 된 쿼리를 사용하는 PrepareStatement가 더 안전하고 잘 수행된다는 점에 동의합니다. 우리의 응용 프로그램에서는 사용자가 실제로 WHERE 절을 입력 할 수 있습니다 (사용자는 WHERE CITY = 'BELLEVUE'를 입력합니다). 사용자 입력을 매개 변수화 된 쿼리로 변환하는 오픈 소스 제품을 알고 계십니까? SQL Parser를보고 있었지만 상용 제품입니다. – galina62
매개 변수의 장소 표시 자로 물음표와 함께 쿼리를 제공합니다. 이 명령문을 준비한 다음 사용자 입력을 매개 변수 값으로 제공하여 커서를 실행합니다 (또는 커서로 여는 경우). 이미 준비되었으므로 구문이 이미 결정되었습니다. 사용자의 입력은 다른 것으로 해석 될 수 없습니다. – WarrenT
- 1. XMLException 형식이 올바르지 않음 (토큰이 유효하지 않음)
- 2. Google+ OAuth 인증 오류 (토큰이 유효하지 않음)
- 3. XML 구문 분석 오류 : 형식이 올바르지 않음 (토큰이 유효하지 않음)
- 4. Linkedin 토큰이 유효하지 않습니다.
- 5. 토큰이 유효하지 않은 Evernote
- 6. SQLException - 유효하지 않은 커서 상태
- 7. Ouath 토큰이 유효하지 않은지 확인하십시오.
- 8. 토큰이 유효하지 않은 경우 리디렉션
- 9. offlineAccess 토큰이 유효하지 않은 OAuthException
- 10. XML :: 심플하지 않음 (토큰이 유효하지 않은 토큰) 토큰
- 11. SQLException catch 된 유효하지 않은 열 인덱스
- 12. 필요한 위조 토큰이 제공되지 않았거나 유효하지 않았습니다.
- 13. 레일 4의 devise_invitable 초대 토큰이 유효하지 않습니다.
- 14. CreateNavigator (X 경로에 유효하지 않은 토큰이 있음)
- 15. FileUplaod : 위조 토큰이 제공되지 않았거나 유효하지 않습니다.
- 16. symfony2 csrf 토큰이 아약스 요청시 유효하지 않습니다.
- 17. 토큰이 ASP.NET ID로 비밀번호 재설정시 유효하지 않습니다.
- 18. C# WPF 토큰이 BrushConverter에서 유효하지 않습니다.
- 19. 레일 4.1.8 : 인증 토큰이 유효하지 않습니다.
- 20. php + unixODBC + DB2 + DESCRIBE = 토큰이 유효하지 않습니까?
- 21. const 클래스의 토큰이 유효하지 않습니다. C#
- 22. csurf AJAX 호출 - CSRF 토큰이 유효하지 않습니다.
- 23. 페이스 북의 api - 토큰이 유효하지 않습니다.
- 24. 토큰이 유효하지 않습니다 - YouTube API의 오류 401
- 25. "XML을 구문 분석하는 중 오류 발생 : 형식이 올바르지 않음 (토큰이 유효하지 않음)"
- 26. python, suds 및 클라이언트 인증서 : SAXParseException : 형식이 올바르지 않음 (토큰이 유효하지 않음)
- 27. 또 다른 실패 구문 분석 XML : 형식이 올바르지 않음 (토큰이 유효하지 않음) 오류
- 28. JOOMLA + XML 구문 분석 오류 (1 : 1496). 오류 4 : 형식이 올바르지 않음 (토큰이 유효하지 않음)
- 29. webapp2 인증 토큰이 사라지지 않음
- 30. GCM에 등록 토큰이 수신되지 않음
Q : 작은 따옴표 (')를 사용할 수 있습니까? 맞습니까? 그렇다면 문제가 무엇입니까? – FoggyDay
정확하고 작은 따옴표가 올바르게 작동합니다. 사용자의 입력을 이스케이프 처리하여 쿼리를 보호하려고합니다 (링크 : https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet 참조). 완벽한 솔루션은 PreparedStatement를 사용하는 것이지만, 우리의 경우 쿼리는 사용자가 입력하여 생성하므로 쿼리를 파싱하고 PreparedStatement를 생성하는 것은 약간의 비용이 듭니다. 탈출은 또 다른 방법이며, 이것이 우리가 작은 따옴표를 2 개의 작은 따옴표로 바꾸는 이유입니다. – galina62