2015-11-10 2 views
0

В моем веб-приложении Struts2 Java пользователям разрешено запрашивать базу данных. В качестве примера пользователь должен получить сведения о сотрудниках, чье первое имя равно «Чарльз». Затем он/она может выбрать столбцы и критерии отчета (firstname = 'Charles').Struts2: сохранить SQL-запрос в базе данных

После того, как пользователь предоставит выше входы, ему необходимо сохранить соответствующий SQL-запрос в базе данных.

e.g. SQL -> SELECT * FROM employee WHERE firstname='Charles' 

Вот что я пытаюсь в своем классе действий.

try { 
     connection = DriverManager.getConnection(
       SelectAction.getDatabase(), SelectAction.getUser(), 
       SelectAction.getPassword()); 

     if (connection != null) { 

      System.out.println("Database connection established!"); 

      stmt = connection.createStatement(); 

      String sql = "INSERT INTO reports (report_id, sql) values ('" + reportId + "', '" + sqlQ + "');"; 
      System.out.println("sql--->" + sql); 
      // Executing query 
      stmt.executeQuery(sql); 

      return SUCCESS; 

     } else { 
      System.out.println("----Failed to make connection!"); 
      return ERROR; 
     } 
    } catch (SQLException e) { 
     System.out.println("Connection Failed!!"); 
     e.printStackTrace(); 
     return SUCCESS; 
    } 

Это мой запрос на ввод.

INSERT INTO reports (report_id, sql) values ('mynewreport', 'SELECT * FROM employee WHERE firstname='Charles''); 

У меня возникает следующая ошибка в моей консоли.

ERROR: syntax error at or near "Charles" 

Я думаю, что здесь я использую строку, так что проблема связана с кавычками ('). Я использую postgreSQL в качестве базы данных.

Любые предложения по решению этой проблемы?

+0

Если вы начинаете сейчас, рассмотреть вопрос об изучении что-то 10 лет новее, как JPA 2. [DAO мертв, да здравствует JPA] (http://www.adam-bien.com/roller/abien/entry/jpa_ejb3_killed_the_dao). –

ответ

2

Ни в коем случае использует строковое сопоставление введенных пользователем значений для построения инструкции SQL.
Ни в коем случае не использовать конкатенацию любых нецелых значений для построения инструкции SQL.
Вы оставите себя открытыми для SQL Injection атак и/или ошибок SQL-запроса.
Хакеры будут любить вас за то, что вы позволите им украсть все ваши данные, а гнусные могут повредить или удалить все ваши данные, а вы смехотворно смеетесь над вами по дороге в банк.

Используйте PreparedStatement и маркеры параметров.

String sql = "INSERT INTO reports (report_id, sql) values (?, ?)"; 
try (PreparedStatement stmt = conn.prepareStatement(sql)) { 
    stmt.setString(1, reportId); 
    stmt.setString(2, sqlQ); 
    stmt.executeUpdate(); 
} 
+0

Активировано для смелых :) –

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