복붙노트

[SQL] 자바 프로그램에 방지 SQL 주입 공격

SQL

자바 프로그램에 방지 SQL 주입 공격

나는 데이터베이스 테이블을 업데이트하는 내 자바 프로그램에 문을 추가해야합니다 :

String insert =
    "INSERT INTO customer(name,address,email) VALUES('" + name + "','" + addre + "','" + email + "');";

나는이 같은 SQL 인젝션을 통해 악용 될 수 있다는 것을 들었다 :

DROP TABLE customer; 

내 프로그램은 자바 GUI 모든 이름, 주소가 이메일 값은 Jtextfields에서 검색됩니다. 해커에 의해 내 삽입 문에 추가 될 수 있으며 내가이를 방지 할 수있는 방법, 나는 다음과 같은 코드 (DROP 표 고객이) 방법을 알고 싶어요.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.당신은이에 대한 정보를 원하시면이 문서를 확인하실 수 있습니다! :)

    당신은이에 대한 정보를 원하시면이 문서를 확인하실 수 있습니다! :)

    나는 매개 변수화 된 쿼리를 권장합니다 :

    String selectStatement = "SELECT * FROM User WHERE userId = ? ";
    PreparedStatement prepStmt = con.prepareStatement(selectStatement);
    prepStmt.setString(1, userId);
    ResultSet rs = prepStmt.executeQuery();
    
  4. ==============================

    4.DROP 표 고객 공격자는 'foo@example.com ")과 같이 입력해야 이메일의 필드에를하면 모든 작업이 완료된다.

    DROP 표 고객 공격자는 'foo@example.com ")과 같이 입력해야 이메일의 필드에를하면 모든 작업이 완료된다.

    당신은 JDBC 문에 대한 적절한 이스케이프를 사용하여 이러한 문제를 방지 할 수 있습니다.

  5. ==============================

    5.당신이 당신의 문자열 문에서 물음표를 사용해야하는 이유입니다 :

    당신이 당신의 문자열 문에서 물음표를 사용해야하는 이유입니다 :

     PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                         SET SALARY = ? WHERE ID = ?");
       pstmt.setBigDecimal(1, 153833.00)
       pstmt.setInt(2, 110592)
    

    여기에서 인용

  6. ==============================

    6.PreparedStatement의를 위해 이동 해, PreparedStatement의 장점 :

    PreparedStatement의를 위해 이동 해, PreparedStatement의 장점 :

    전반적으로 빠른 실행과 일괄 적으로 동일한 SQL 문을 재사용 할 수있는 능력에 SQL 문을 리드의 사전 컴파일 및 DB 측 캐싱.

    따옴표 및 기타 특수 문자 이스케이프 내장하여 SQL 주입 공격의 자동 방지. 이 값을 설정하기 위해 PreparedStatement로하는 setXXX의 () 메소드를 사용하는 것이 필요합니다

  7. ==============================

    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. ==============================

    8.다른 모든 해답은 당신이 자바에서 SQL 주입을 해결할 수있는 방법으로 당신에게 말할지라도, 무 케시 쿠마에 의해 대답은 실제로 실제로 공격의이 종류를 방해하는 사람으로 알려줍니다. SQL 주입 공격을 방해하는 그 실제로 DB 서버가 매개 변수화 쿼리를 사용하여 자신의 추천에 따라 프로그래머로 당신을 한 것으로 이해합니다.

    다른 모든 해답은 당신이 자바에서 SQL 주입을 해결할 수있는 방법으로 당신에게 말할지라도, 무 케시 쿠마에 의해 대답은 실제로 실제로 공격의이 종류를 방해하는 사람으로 알려줍니다. SQL 주입 공격을 방해하는 그 실제로 DB 서버가 매개 변수화 쿼리를 사용하여 자신의 추천에 따라 프로그래머로 당신을 한 것으로 이해합니다.

    여기를 참조하십시오 - SQL 인젝션 취약점을 방지

    자바 프로그래머가 각 & 모든 입력 문자열을 소독하기 위해에 의해 처리됩니다 DB 벤더가 우리에게 문 준비의 옵션을 제공하고 그들이 준비 및 일의 휴식 및 것을 사용하여 쿼리를 실행하는 우리에게, 그래서 그것은 가능하지 않을 것 DB 공급 업체.

    DROP 표 고객 등 과감한 같은 것들; 발생하지만, SQL 인젝션의 기본 전제는 아무도 단지 잘못된 입력을 제공하여 쿼리를 깰 수 (중 의도적 또는 비 - 의도적 인) 없을 것입니다하지 않을 수 있습니다.

    OWASP - SQL 인젝션 방지 치트 시트

  9. ==============================

    9.또한 가능한 한 단단히 데이터베이스에 액세스 계정의 권한을 제한해야합니다. 예를 들어, 검색을 위해 계정에만 필요합니다 해당 테이블과 컬럼에 대한 읽기 권한이 있어야합니다. 이 민감한 데이터에 대한 손상 SQL 주입 및 제한 접근을 방지 할 수 있습니다.

    또한 가능한 한 단단히 데이터베이스에 액세스 계정의 권한을 제한해야합니다. 예를 들어, 검색을 위해 계정에만 필요합니다 해당 테이블과 컬럼에 대한 읽기 권한이 있어야합니다. 이 민감한 데이터에 대한 손상 SQL 주입 및 제한 접근을 방지 할 수 있습니다.

  10. from https://stackoverflow.com/questions/9516625/prevent-sql-injection-attacks-in-a-java-program by cc-by-sa and MIT license