2010-11-10 19 views
1

我正在使用Java作爲Web應用程序,並且正在使用MySql數據庫。在執行它之前,我需要轉義查詢。這是我的實際代碼:Java&MySql - 在執行它之前如何逃避查詢

db_result=mydb.selectQuery("SELECT nickname FROM users WHERE nickname='"+log_check_user+"' AND password='"+log_check_pass+"'"); 

public Vector selectQuery(String query) { 
    Vector v = null; 
    String [] record; 
    int colonne = 0; 
    try { 
    Statement stmt = db.createStatement(); 
    ResultSet rs = stmt.executeQuery(query); 
    v = new Vector(); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    colonne = rsmd.getColumnCount(); 

    while(rs.next()) { 
     record = new String[colonne]; 
     for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1); 
     v.add((String[]) record.clone()); 
    } 
    rs.close(); 
    stmt.close(); 
    } catch (Exception e) { e.printStackTrace(); errore = e.getMessage(); } 

    return v; 
} 

我需要這個,你可以相信,以避免SQL注入問題!我該怎麼做?

+0

db是什麼?什麼樣的對象;哪一堂課?根據您使用的數據庫驅動程序,可能有更好的方法,如使用預準備語句。 – Kissaki 2010-11-10 15:08:26

+0

MySql ...我寫過了:) jdbc驅動! – markzzz 2010-11-10 16:25:36

回答

18

使用prepared statement

有時是使用PreparedStatement對象將SQL語句發送到數據庫更加方便。這種特殊類型的語句來自更一般的類,Statement ...

如果要多次執行一個Statement對象,它通常會減少執行時間來使用PreparedStatement對象。

PreparedStatement對象的主要特徵是,與Statement對象不同,它在創建時會被賦予一個SQL語句。這樣做的好處是,在大多數情況下,這個SQL語句會立即發送到DBMS,在那裏編譯它。因此,PreparedStatement對象不僅包含一條SQL語句,而且包含一條預編譯的SQL語句。這意味着當執行PreparedStatement時,DBMS可以直接運行PreparedStatement SQL語句,而無需先編譯它...

+3

這個。不能夠滿足。 – 2010-11-10 15:11:47

+0

+1。此外,矢量被認爲是不贊成,請參閱http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky 2010-11-10 15:34:09

+2

在所有關於SQL注入的討論中,這個鏈接是必填:http://xkcd.com/327/ – JeremyP 2010-11-10 16:17:52