Это одна из проблем с конфликтом ключевого слова в модуле запроса моего приложения, пожалуйста, посмотрите, можете ли вы сказать мне умное решение.Интеллектуальное решение SQL-инъекции
Во-первых, в модуле запроса, каждое условие запроса содержит три части в интерфейсе:
имя 1.field, его значение фиксируется, например, происхождение, finalDest ...
2.operator, это выбранный список, который включает «как», «не нравится», «in», «not in», «=», «! =»
3.значение, эта часть вводится пользователем. end, он будет собирать инструкцию SQL в соответствии с критериями запроса пользовательского интерфейса, например, если пользователь вводит/выбирает следующие данные в пользовательском интерфейсе
Field Name Operator Value
origin like CHI
finalDest in SEL
В заднем конце, он будет генерировать следующий SQL:
выберите * от заказа, где происхождения, как '% CHI%' и finalDest в ('SEL').
Но есть ошибка, например, если пользователь вводит некоторый специальный символ в «значение», например «« »,« _ »и т. Д., Это приведет к тому, что сгенерированный SQL также содержит« или _ », например:
выберите * from Booking, где происхождение типа '% C_HI%' и finalDest in ('S'EL').
вы могли видеть, как есть специальный символ «где» блок, то SQL не может быть выполнено
Для этой задачи, мое решение добавить экранирующий символ «/» перед специальным символом перед но я знаю, что это просто «или», которые будут противоречить ключевым словам SQL, знаете ли вы, есть ли какие-либо другие аналогичные символы, которые мне нужно обработать, или у вас есть идея, которая может избежать инъекции.
Извините, забыли, сказал вам, какой язык я использую, я использую java, DB - это mysql, я также использую hibernate, многие люди говорят, почему я не использовал PreparedStatement, это немного сложно, просто Speakin g, в моей компании у нас был FW, называемый динамическим запросом, мы предварительно определили фрагмент SQL в XML-файле, тогда мы собираем SQL в соответствии с прохождением UI в критериях с выражением jxel, поскольку SQL является своего рода предопределенные вещи, я боюсь, если вы измените использование PreparedStatement, это потребует значительных изменений для нашей FW, поэтому нам очень важно решить проблему SQL-инъекции простым способом.
Предположительно вы отправляете этот запрос на сервер, сервер должен иметь схему аутентификации, которая только может получить доступ к клиенту, а клиент должен дезинфицировать его ввод базы данных. – awiebe
Какой серверный язык вы используете? –
HI, я использую mysql5 + hibernate, но я предположил, что он не должен зависеть от mysql и должен быть общим кросс-платформенным оператором SQL. – Chailie