Есть ли Java-эквивалент PHP mysql_real_escape_string ()?
Это чтобы избежать попыток внедрения SQL перед передачей их в Statement.execute ().
Я знаю, что вместо этого могу использовать PreparedStatement, но давайте предположим, что это одноразовые операторы, поэтому их подготовка приведет к снижению производительности . Я уже изменил код для использования PreparedStatement, но, учитывая структуру существующего кода, функция escape () сделает изменения кода намного проще для просмотра и обслуживания; Я предпочитаю легко поддерживать код, если нет веских причин для дополнительной сложности. Кроме того, PreparedStatements по-разному обрабатываются базой данных, поэтому это может привести к ошибкам в базе данных, с которыми мы раньше не сталкивались, что потребует дополнительного тестирования перед выпуском в эксплуатацию.
Apache StringEscapeUtils escapeSQL () экранирует только одинарные кавычки.
Постскриптум:
В окружающей среде я унаследовал множество тонкостей, которых я намеренно избегал в своем вопросе.
Два вопроса для рассмотрения:
1) Подготовленные операторы не являются панацеей и не обеспечивают 100% защиты от внедрения SQL. Некоторые драйверы баз данных создают параметризованные запросы, используя небезопасную конкатенацию строк, а не предварительно компилируя запрос в двоичную форму. Кроме того, если ваш SQL основан на хранимых процедурах, вы должны убедиться, что хранимые процедуры сами не создают запросы небезопасными способами.
2) Наиболее подготовленная реализация оператора связывает оператор с подключением к базе данных, для которого был создан экземпляр оператора. Если вы используете пул соединений с базой данных, вы должны быть осторожны с
использовать ссылку на подготовленное заявление только с той связью, по которой оно было подготовлено. Некоторые механизмы объединения реализуют это прозрачно. В противном случае вы также можете объединить подготовленные операторы или (самое простое, но более затратное) создать новый подготовленный оператор для каждого запроса.