#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, это очень зрелый проект.