2010-11-10 2 views
1

Я использую Java для веб-приложения, и я работаю с базой данных 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

+0

MySql ... я написал это :) jdbc driver! – markzzz

ответ

18

Используйте prepared statement:

Иногда удобнее использовать PreparedStatement объект для отправки SQL заявления в базу данных. Это особый тип заявления является производным от более общего класса, Statement ...

Если вы хотите выполнить Statement объект много раз, как правило, сокращает время выполнения, чтобы использовать PreparedStatement объект вместо этого.

Основная особенность объекта PreparedStatement заключается в том, что в отличие от объекта Statement ему присваивается инструкция SQL при ее создании. Преимущество этого заключается в том, что в большинстве случаев этот оператор SQL сразу отправляется в СУБД, где он компилируется. В результате объект PreparedStatement содержит не только инструкцию SQL, но и оператор SQL, который был предварительно скомпилирован. Это означает, что когда выполняется PreparedStatement, СУБД может просто запустить инструкцию SQL PreparedStatement без необходимости ее компиляции сначала ...

+3

Это. Невозможно выдвинуть достаточно. –

+0

+1. Кроме того, вектор считается устаревшим, см. Http://stackoverflow.com/questions/1386275/why-java-vector-class-is-considered-obsolete-or-deprecated – Qwerky

+2

Во всех обсуждениях SQL-инъекции эта ссылка обязательный: http://xkcd.com/327/ – JeremyP

Смежные вопросы