Стандартная библиотека для экранирования строк (без подготовленных операторов)

#java #sql #stringescapeutils

#java #sql #stringescapeutils

Вопрос:

Я ищу стандартную библиотеку Java для экранирования строк, прежде чем использовать их в инструкции SQL. Это в основном для предотвращения ошибок, а также для предотвращения внедрения SQL. К сожалению, я не смогу использовать подготовленные инструкции, как это предлагается во многих других потоках.

Есть ли какая-либо стандартная библиотека, которую я могу использовать? Я видел StringEscapeUtils в Apache Commons, но я действительно не знаю, соответствует ли это уровню техники.

Заранее большое вам спасибо!

Комментарии:

1. Apache Commons — это зрелая библиотека. У нее могут быть свои недостатки, но вам было бы трудно искать лучшую библиотеку OSS Java для ваших целей.

2. Привет, Виктор, большое тебе спасибо за твои мысли. 🙂 Поскольку комментариев об обратном нет, я думаю, что воспользуюсь Apache Commons (это было быстро) 😉

3. НЕ используйте Apache Commons StringEscapeUtils.escapeSql(), потому что она неправильно экранирует sql для предотвращения sql-инъекций. Она была удалена из версии 3 (предположительно, потому что они хотят отговорить людей использовать это вместо PreparedStatements, которые безопасны).

Ответ №1:

Это нетривиальная проблема и критическая из-за проблем с безопасностью SQL-инъекций. Я бы вместо этого рассмотрел возможность использования аргументов типа SQL ? вместо экранирования. Например, для поиска определенной строки:

Вместо того, чтобы делать:

 SELECT * FROM accounts
    WHERE name = 'escapedstring1' AND password = 'escapedstring2'
  

Я бы использовал:

 SELECT * FROM accounts WHERE name = ? AND password = ?
  

Затем вам нужно будет передать введенные строки (без необходимости экранирования) в качестве аргументов вашим методам SQL. Вот как это сделать с помощью JDBC. Не уверен, что это применимо к вам.

Что-то вроде:

 String statement = "SELECT * FROM accounts WHERE name = ? AND password = ?";
try {
  PreparedStatement stmt = databaseConnection.prepareStatement(updateString);
  // notice that it is 1 based, not 0 (ick)
  stmt.setString(1, name);
  stmt.setString(2, password);
  ResultSet results = stmt.executeQuery();
  

Вот как ORMLite, моя библиотека ORM, делает это в качестве примера, используя аргумент select.

Надеюсь, это поможет.

Комментарии:

1. Привет, Грей, спасибо за твой совет. На мой взгляд, это выглядит довольно неплохо! Я проверю это. Я должен выяснить, сколько усилий потребуется для изменения уровня доступа к данным… Еще раз, большое спасибо!

2. Хотел бы я оценить вас 1. Но всплывающее окно сообщает мне, что мне нужно как минимум 15 очков репутации, чтобы оценить 1. 🙁

Ответ №2:

Вы можете использовать Apache Commons, это очень зрелый проект.