2012-03-07 2 views
1

내 Java 프로그램에서 Hyibernate 기술을 사용하여 항목이라는 MySQL 데이터베이스 테이블에 액세스했습니다.이 테이블에는 "itemname itemprice itemid"라는 열이 있습니다 & 내 Java 프로그램에 데이터를 가져 오기위한 HQL 문이 있습니다. 또한 항목 테이블에서 채워지는 콤보 상자가 있습니다. 콤보 상자에서 itemname을 선택하면 itemid & itemplice, &이라는 편집 불가능한 두 개의 jtext 필드가 자동으로 채워집니다. 프로그램의 다른 부분에는 해당 jtextfields에서 문자열 값을 가져 오는 코드가 있습니다 & POJO 클래스를 사용하여 orders라는 다른 데이터베이스 테이블에 해당 값을 씁니다. .최대 절전 및 보안 위협

나는 이런 종류의 프로그램이 SQL injections에 의해 공격받을 수 있다는 것을 알고 싶습니까? 우리가 최대 절전 모드를 사용한다면 그것은 SQL injection 공격으로부터 안전합니까? ... 내 프로그램에 보안 위협이 간략하게 설명되어있는 경우 어떻게 피할 수 있습니까?

여기에 몇 가지 코드를 게시합니다. 이 문은 콤보 상자

String SQL_QUERY = "Select items.iname,items.iid,items.iprice from Item items"; 

을 채우기 위해이 문장은 jtextfields을 채 웁니다. "selecteditem"변수는 콤보 상자의 선택된 색인입니다.

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'"; 

이 방법은

//To send data to the orders table 
private void fillordertable(){ 
    String itemname = (String) jcbItemCode.getSelectedItem(); 
    String itempric = jtfItemPrice.getText(); 
    String tmp = jtfQuantity.getText(); 
    int itemqty = Integer.parseInt(tmp); 
    String temp = jtfUnitPrice.getText(); 
    double unitpric = Double.parseDouble(temp); 
    Session session = null; 

    //This variables for validating purposes 
    String tempcname = jtfName.getText(); 
    String tempcemail = jtfEmail.getText(); 
    if(tempcname.equals("") || tempcemail.equals("")){ 
     jtaDisplay.setText("Check * fields"); 
    } 
    else{ 
    try{ 
    SessionFactory sessionFactory = new org.hibernate.cfg.Configuration().configure().buildSessionFactory(); 
    session =sessionFactory.openSession(); 
    session.beginTransaction(); 

    Order order = new Order(); 
    order.setItcode(itemcode); 
    order.setItdiscription(itemdis); 
    order.setItqty(itemqty); 
    order.setItemprice(unitpric); 
    order.setTotprice(unitpric * itemqty); 
    order.setOstatus("Placed"); 

    session.save(order); 
    session.getTransaction().commit(); 
    } 
    catch(Exception exc){ 
    jtaDisplay.setText(exc.getMessage()); 
    } 
    finally{ 
    session.flush(); 
    session.close(); 
    } 
    jtaDisplay.setText("Order & customer tables updated successfully !!!"); 
} 
} 

내가 여기에 게시하면 내 모든 코드를 이해하기 어려운 주문 테이블에 데이터를 기록합니다. 그래서 나는 내 질문에 대답하는데 도움이된다고 생각하는 몇 가지 코드를 게시했다. 충분하지 않다면 의견을 말하십시오.

감사합니다.

+0

우리에게 어떤 코드를 보여 주면 아마도 우리는 어떤 부분이 SQL 인젝션에 취약한 지 알 수 있습니다. –

+0

일부 코드를 게시했습니다 – Grant

답변

4
String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = '"+selecteditem+"'"; 

는 SQL 인젝션되기 쉽다.

문자열을 연결하여 SQL 또는 HQL 쿼리를 생성하는 것은 일반적으로 나쁜 형식이며 SQL 주입 가능성을 유발할 수 있습니다.

안전한 방법은 SQL 또는 HQL에서 명명 된 매개 변수를 사용하는 것입니다. 당신은 코드와 쿼리를 실행하려면 약 방식이어야한다

String SQL_QUERY ="Select items.iname,items.iid,items.iprice from Item items where items.iid = :selecteditem";  
SQLQuery query = session.createSQLQuery(SQL_QUERY);  
query.setParameter("selecteditem", selecteditem); 
List<Object[]> results = query.list(); 

: 같은 하이버 네이트 세션, 무엇인가를 획득 한 후, SQL 것으로 보인다 귀하의 예제에서는

.

HQL에도 유사한 사항이 적용됩니다.

문자열을 연결 한 경우 famous xkcd과 같이 해커가 입력 한 악의적 인 값이 쿼리의 일부가되어 끔찍한 일을 할 수 있습니다.

웹 양식이 아니라 데스크톱 응용 프로그램 인 경우이 변수에 들어갈 수있는 값을 완벽하게 제어 할 수 있지만 이러한 작업을 올바르게 수행하는 것이 좋습니다.

명명 된 매개 변수의 또 다른 효과는 매개 변수화 된 sql을 다른 매개 변수 값에 대해 캐시하고 재사용 할 수 있다는 것입니다. 따라서 보안 문제가없는 경우에도 좋은 아이디어입니다.

+0

"selectedItem"은 콤보 상자의 선택된 색인입니다. 위협인가? ??? – Grant

+1

양식이 코딩되는 방식에 따라 잠재적으로 위협이 될 수 있습니다. 이것이 웹 양식 인 경우, 학대자가 일반적인 양식 제출 프로세스를 건너 뛰는 javascript 호출을 통해 값을 제공 할 수 있습니다. –

+0

나는 그것을 어떻게 막을 수 있습니까 ??? & 이것은 웹 양식이 아니며 간단한 데스크톱 응용 프로그램입니다. – Grant

3

필드 값을 나머지 HQL 텍스트와 연결하여 HQL을 생성하는 경우 문제가 있습니다. 모든 필드 값에 대해 대체 변수를 사용하여 HQL (올바르게)을 사용한다면 괜찮습니다. (분명히 이것에 관해 더 말할 수 있을지 모르지만, OP의 자세한 내용이 없으면, 이것은 현재 우리가 말할 수있는 전부입니다). 또한, 삽입/업데이트 논리가 순전히 POJO를 사용하는 경우, 거기에 괜찮습니다.

UPDATE : 지금 당신은 몇 가지 코드를 게시 한 것을

, 그래 당신은 문제가있다. HQL에서 명명 된 매개 변수를 사용해야합니다. (귀하의 쓰기 코드는 괜찮습니다). selectedItem 데이터가 사용자에 의해 입력되는 경우