2010-11-10 23 views
1

J'utilise Java pour une application web, et je travaille avec une base de données MySql. J'ai besoin d'échapper à la requête avant de l'exécuter. C'est mon code actuel:Java & MySql - Comment faire pour échapper à la requête avant de l'exécuter

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; 
} 

J'ai besoin de cela, comme vous pouvez le croire, pour éviter le problème d'injection SQL! Comment puis-je le faire?

+0

Qu'est-ce que DB2? Quel genre d'objet; quelle classe? Selon le pilote de base de données que vous utilisez, il peut y avoir de meilleurs moyens, comme l'utilisation d'instructions préparées. – Kissaki

+0

MySql ... je l'ai écrit :) pilote jdbc! – markzzz

Répondre

18

Utilisez un prepared statement:

Parfois, il est plus commode d'utiliser un objet PreparedStatement pour envoyer des instructions SQL à la base de données. Ce type spécial de déclaration est dérivée de la classe plus générale, Statement ...

Si vous voulez exécuter plusieurs fois un objet Statement, il réduit généralement le temps d'exécution à utiliser un objet PreparedStatement à la place.

La principale caractéristique d'un objet PreparedStatement est que, contrairement à un objet Statement, une instruction SQL lui est donnée lors de sa création. L'avantage de ceci est que dans la plupart des cas, cette instruction SQL est immédiatement envoyée au SGBD, où elle est compilée. Par conséquent, l'objet PreparedStatement contient non seulement une instruction SQL, mais une instruction SQL qui a été précompilée. Cela signifie que lorsque le PreparedStatement est exécuté, le SGBD peut simplement exécuter l'instruction SQL PreparedStatement sans avoir à le compiler en premier ...

+3

Ceci. Vous ne pouvez pas assez. –

+0

+1. En outre, Vector est considéré comme obsolète, voir http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky

+2

Dans toutes les discussions sur l'injection SQL, ce lien est obligatoire: http://xkcd.com/327/ – JeremyP