[SQL] 자바 프로그램에 방지 SQL 주입 공격
SQL자바 프로그램에 방지 SQL 주입 공격
나는 데이터베이스 테이블을 업데이트하는 내 자바 프로그램에 문을 추가해야합니다 :
String insert =
"INSERT INTO customer(name,address,email) VALUES('" + name + "','" + addre + "','" + email + "');";
나는이 같은 SQL 인젝션을 통해 악용 될 수 있다는 것을 들었다 :
DROP TABLE customer;
내 프로그램은 자바 GUI 모든 이름, 주소가 이메일 값은 Jtextfields에서 검색됩니다. 해커에 의해 내 삽입 문에 추가 될 수 있으며 내가이를 방지 할 수있는 방법, 나는 다음과 같은 코드 (DROP 표 고객이) 방법을 알고 싶어요.
해결법
-
==============================
1.당신의 PreparedStatement를 사용할 필요가있다. 예를 들면
당신의 PreparedStatement를 사용할 필요가있다. 예를 들면
String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);"; PreparedStatement ps = connection.prepareStatement(insert); ps.setString(1, name); ps.setString(2, addre); ps.setString(3, email); ResultSet rs = ps.executeQuery();
이 주입 공격을 방지 할 수 있습니다.
해커 풋 그것은 거기에 당신이 삽입 된 문자열 입력 어딘가에서 오는 경우 방법 - 예를 들어, 웹 페이지에 입력 필드 또는 애플리케이션 또는 유사한 폼의 입력 필드.
-
==============================
2.예를 들면 :
예를 들면 :
name = "'); DROP TABLE customer; --"
삽입에이 값을 얻을 것이다 :
INSERT INTO customer(name,address,email) VALUES(''); DROP TABLE customer; --"','"+addre+"','"+email+"');
사용 제표 및 SQL 인수 (예를 마 휄로우에서 "도난")을 준비 :
String insert = "INSERT INTO customer(name,address,email) VALUES(?, ?, ?);"; PreparedStament ps = connection.prepareStatment(insert);
(; 이름에서 ""와 같은) 또한이 같은 변수가 그들이 비 허용되는 문자를 포함하지 않는 확인 값을 구문 분석합니다.
-
==============================
3.당신은이에 대한 정보를 원하시면이 문서를 확인하실 수 있습니다! :)
당신은이에 대한 정보를 원하시면이 문서를 확인하실 수 있습니다! :)
나는 매개 변수화 된 쿼리를 권장합니다 :
String selectStatement = "SELECT * FROM User WHERE userId = ? "; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setString(1, userId); ResultSet rs = prepStmt.executeQuery();
-
==============================
4.DROP 표 고객 공격자는 'foo@example.com ")과 같이 입력해야 이메일의 필드에를하면 모든 작업이 완료된다.
DROP 표 고객 공격자는 'foo@example.com ")과 같이 입력해야 이메일의 필드에를하면 모든 작업이 완료된다.
당신은 JDBC 문에 대한 적절한 이스케이프를 사용하여 이러한 문제를 방지 할 수 있습니다.
-
==============================
5.당신이 당신의 문자열 문에서 물음표를 사용해야하는 이유입니다 :
당신이 당신의 문자열 문에서 물음표를 사용해야하는 이유입니다 :
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)
여기에서 인용
-
==============================
6.PreparedStatement의를 위해 이동 해, PreparedStatement의 장점 :
PreparedStatement의를 위해 이동 해, PreparedStatement의 장점 :
전반적으로 빠른 실행과 일괄 적으로 동일한 SQL 문을 재사용 할 수있는 능력에 SQL 문을 리드의 사전 컴파일 및 DB 측 캐싱.
따옴표 및 기타 특수 문자 이스케이프 내장하여 SQL 주입 공격의 자동 방지. 이 값을 설정하기 위해 PreparedStatement로하는 setXXX의 () 메소드를 사용하는 것이 필요합니다
-
==============================
7.이 글에서 설명하고있는 바와 같이 여전히 문자열을 연결하는 경우, PreparedStatement의 혼자 도움이되지 않습니다.
이 글에서 설명하고있는 바와 같이 여전히 문자열을 연결하는 경우, PreparedStatement의 혼자 도움이되지 않습니다.
예를 들어, 하나의 악의적 인 공격자는 여전히 다음과 같은 작업을 수행 할 수 있습니다 :
그리고 그것은 단지 SQL 아니지만, 당신이 바인드 매개 변수를 사용하지 않는 경우 JPQL 및 HQL이 손상 될 수 있습니다
PreparedStatement ps = connection.prepareStatement( INSERT INTO customer(name,address,email) VALUES(?, ?, ?) ); int index = 0; ps.setString(++index, name); ps.setString(++index, address); ps.setString(++index, email); ResultSet rs = ps.executeQuery();
SQL 문을 만들 때 결론은, 당신은 문자열 연결을 사용해서는 안됩니다. 그 목적을 위해 전용 API를 사용합니다 :
-
==============================
8.다른 모든 해답은 당신이 자바에서 SQL 주입을 해결할 수있는 방법으로 당신에게 말할지라도, 무 케시 쿠마에 의해 대답은 실제로 실제로 공격의이 종류를 방해하는 사람으로 알려줍니다. SQL 주입 공격을 방해하는 그 실제로 DB 서버가 매개 변수화 쿼리를 사용하여 자신의 추천에 따라 프로그래머로 당신을 한 것으로 이해합니다.
다른 모든 해답은 당신이 자바에서 SQL 주입을 해결할 수있는 방법으로 당신에게 말할지라도, 무 케시 쿠마에 의해 대답은 실제로 실제로 공격의이 종류를 방해하는 사람으로 알려줍니다. SQL 주입 공격을 방해하는 그 실제로 DB 서버가 매개 변수화 쿼리를 사용하여 자신의 추천에 따라 프로그래머로 당신을 한 것으로 이해합니다.
여기를 참조하십시오 - SQL 인젝션 취약점을 방지
자바 프로그래머가 각 & 모든 입력 문자열을 소독하기 위해에 의해 처리됩니다 DB 벤더가 우리에게 문 준비의 옵션을 제공하고 그들이 준비 및 일의 휴식 및 것을 사용하여 쿼리를 실행하는 우리에게, 그래서 그것은 가능하지 않을 것 DB 공급 업체.
DROP 표 고객 등 과감한 같은 것들; 발생하지만, SQL 인젝션의 기본 전제는 아무도 단지 잘못된 입력을 제공하여 쿼리를 깰 수 (중 의도적 또는 비 - 의도적 인) 없을 것입니다하지 않을 수 있습니다.
OWASP - SQL 인젝션 방지 치트 시트
-
==============================
9.또한 가능한 한 단단히 데이터베이스에 액세스 계정의 권한을 제한해야합니다. 예를 들어, 검색을 위해 계정에만 필요합니다 해당 테이블과 컬럼에 대한 읽기 권한이 있어야합니다. 이 민감한 데이터에 대한 손상 SQL 주입 및 제한 접근을 방지 할 수 있습니다.
또한 가능한 한 단단히 데이터베이스에 액세스 계정의 권한을 제한해야합니다. 예를 들어, 검색을 위해 계정에만 필요합니다 해당 테이블과 컬럼에 대한 읽기 권한이 있어야합니다. 이 민감한 데이터에 대한 손상 SQL 주입 및 제한 접근을 방지 할 수 있습니다.
from https://stackoverflow.com/questions/9516625/prevent-sql-injection-attacks-in-a-java-program by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 합니까 sqlite3를 외부 키 제약 조건을 지원하지? (0) | 2020.04.02 |
---|---|
[SQL] 무향 그래프의 연결된 모든 서브 그래프를 찾는 방법 (0) | 2020.04.02 |
[SQL] MySQL의 재귀? (0) | 2020.04.02 |
[SQL] SQL은 : 2 개의 다른 AUTO_INCREMENT와의 관계 테이블 만들기 (0) | 2020.04.02 |
[SQL] GROUP BY와 집계 순차적 인 숫자 값 (0) | 2020.04.02 |