2016-07-18 8 views
1

私は挿入された-regBroj-パラメータがベース内のものと同じであるhibernateのベースから列を削除します。フォームデータベースを削除できませんSQLGrammarException

これは私が常に SQLGrammarException取得deleting.Butするためのコントローラでの私の方法です。 'where句'

に不明な列 'BG026CH':com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:によって引き起こさ をこの 'BG026CH'は、私がデータベース内の車両を見つけて削除するためのパラメータとして使用するregBrojの値です。そしてadminPageのテキストエリアに挿入します。

public String izbrisi(String regBroj) { 
    List<Vozilo> lista = listaj(); 
     Session s = HibernateUtil.getSessionFactory().getCurrentSession(); 
     Transaction t = s.beginTransaction(); 

     for (int i = 0; i < lista.size(); i++) { 
      if (regBroj .equals(lista.get(i).getRegBroj())) { 
       String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk=" + regBroj + ""; 
       Query q = s.createQuery(izbrisiquery); 
       int a = q.executeUpdate(); 
       t.commit(); 
       return "adminPage"; 
      } 
     } 
     t.commit(); 
     return "error"; 


    } 
+0

以下の@Dhavalの答えはすぐに問題を解決するはずですが、SQL注入を避けるために準備されたステートメントの使用を慎重に検討する必要があります。 –

答えて

2

彼らは自動的に引用符でフィールド値をエスケープの世話をする、と彼らはまた、SQLインジェクションからあなたを守ってくれるので、あなたは、プリペアドステートメントを使用して検討すべきであるこれらの1

String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk='" + regBroj + "'"; 
+0

偉大な作品私は追加することを忘れてしまった - '' - 私のクエリ内。 – Stanimir

2

で文字列の下に交換してください。

// obtain a Connection object using your Hibernate session, or through some other means 
Connection conn = getDBConnection(); 

for (int i = 0; i < lista.size(); i++) { 
    if (regBroj .equals(lista.get(i).getRegBroj())) { 
     String izbrisiquery = "DELETE FROM Korisnik WHERE brojLk = ?"; 
     PreparedStatement ps = conn.prepareStatement(izbrisiquery); 
     ps.setString(1, regBroj); 
     ps.executeUpdate(); 
     t.commit(); 

     return "adminPage"; 
    } 
} 

は、悪意のあるユーザーが、 Korisnikテーブルを破壊誰かが brojLKため '' OR TRUEの値を渡すためにUIをハッキングすることを想像できるかSQLインジェクション作品、またはどのように参照してください。これは、結果 DELETEの文は次のようになります。

つまり
DELETE FROM Korisnik WHERE brojLk = '' OR TRUE 

、この注入されたクエリは、あなたのテーブル全体をドロップします!プリペアドステートメントはこの入力を犠牲にし、ハッカーはクエリを実行するまでは得られません。

+0

これは愚かな質問かもしれません。準備されたステートメントの良いチュートリアルを知っていますか – Stanimir

+0

[MKYong](http://www.mkyong.com/jdbc/jdbc-preparestatement-example-select-list-of-the-レコード/)、通常は物事を説明する良い仕事をしています。 –

+0

@Stanimirそれをキャッシュするには、prepared statementがより適していることは別として、 –

関連する問題