2010-11-10 20 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