Есть ли хорошие библиотеки Java, которые упрощают создающие приложения командной строки? [закрытый]

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

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

Мой подход:

  • Если вы ожидаете, что ввод будет целым, убедитесь, что он действительно целое число. В языке с переменным типом, таком как PHP, этот очень важен. Вы можете использовать, к примеру, это очень простое, но мощное решение: sprintf("SELECT 1,2,3 FROM table WHERE 4 = %u", $input);
  • Если вы ожидаете чего-то еще от целого шестнадцатеричного значения. Если вы отбросите его, вы полностью избежите ввода. В C / C ++ есть функция, называемая mysql_hex_string() , в PHP вы можете использовать bin2hex() . Не беспокойтесь о том, что экранированная строка будет иметь размер в 2 раза по сравнению с исходной длиной, потому что даже если вы используете mysql_real_escape_string, PHP должен выделять одну и ту же емкость ((2*input_length)+1), что то же самое.
  • hex метод часто используется при передаче двоичных данных, но я не вижу причин, почему бы не использовать его во всех данных для предотвращения атак SQL-инъекций. Обратите внимание, что вам необходимо предварительно добавить данные с помощью 0x или использовать функцию MySQL UNHEX.

Так, например, запрос:

SELECT password FROM users WHERE name = 'root'

Будет:

SELECT password FROM users WHERE name = 0x726f6f74

или

SELECT password FROM users WHERE name = UNHEX('726f6f74')

Hex - идеальный выход.

Разница между функцией UNHEX и префиксом 0x

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

Префикс ** 0x ** может использоваться только для столбцов данных, таких как char, varchar, text, block, binary, и т. д. Кроме того, его использование немного сложно, если вы собираетесь вставить пустую строку. Вам придется полностью заменить его на '', или вы получите сообщение об ошибке.

UNHEX () работает в любом столбце; вам не нужно беспокоиться о пустой строке.


Hex-методы часто используются в качестве атак

Обратите внимание, что этот шестиугольный метод часто используется как атака SQL-инъекции, где целые числа точно так же, как и строки mysql_real_escape_string. Тогда вы можете избежать использования кавычек.

Например, если вы просто делаете что-то вроде этого:

"SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])

атака может очень легко ввести вас . Рассмотрим следующий введенный код, возвращенный из вашего скрипта:

SELECT ... WHERE id = -1 union all select table_name from information_schema.tables

и теперь просто извлеките структуру таблицы:

SELECT ... WHERE id = -1 union all select column_name from information_schema.column где table_name = 0x61727469636c65

И тогда просто выберите нужные данные. Разве это не круто?

Но если кодер инъекционного сайта будет шестнадцатеричным, инъекция не будет возможна, потому что запрос будет выглядеть следующим образом: SELECT ... WHERE id = UNHEX('2d312075...3635')

40
задан Remko Popma 7 September 2018 в 01:08
поделиться

7 ответов

Я использовал библиотека Apache Commons CLI для парсинга параметра командной строки. Это довольно просто в использовании и имеет довольно хорошая документация .

то, Какую библиотеку Вы выбираете, вероятно, сводится, какой стиль опций Вы предпочитаете (" - стиль гну" или "-javac-стиль").

26
ответ дан Samuel Liew 27 November 2019 в 01:40
поделиться

JLine выглядит полезным.

JLine является библиотекой Java для обработки консольного входа. Это подобно в функциональности BSD editline и GNU readline. Люди, знакомые с readline/editline возможностями современных оболочек (таких как удар и tcsh), найдут, что большинство особенностей редактирования команды JLine знакомо.

И это действительно перечисляет заполнение клавишей Tab в функции

20
ответ дан svict4 27 November 2019 в 01:40
поделиться

Взгляните на arg4j.

6
ответ дан Pedro Henriques 27 November 2019 в 01:40
поделиться

В нашей компании мы используем JewelCli, который использует аннотируемое определение интерфейса Java для описания Интерфейса командной строки в декларативном стиле.

Легкий и простой использовать, я рекомендую его.

4
ответ дан Julien Hoarau 27 November 2019 в 01:40
поделиться

Я использовал Java Простой Синтаксический анализатор Аргумента экстенсивно. Это обрабатывает все виды типов опции, имеет хорошо разработанный и библиотеку (включая опцию записать пользовательские синтаксические анализаторы), и предоставляет хорошую документацию и в JavaDocs и онлайн .

я думаю, что Ваше требование заполнения клавишей Tab заботилось бы об оболочкой, а не библиотекой парсинга командной строки.

3
ответ дан Brett Daniel 27 November 2019 в 01:40
поделиться

Существует порт Java GNU getopt библиотека для парсинга командной строки. Для редактирования команды и заполнения клавишей Tab там JLine (как mmyers уже рекомендовал).

1
ответ дан eneset 27 November 2019 в 01:40
поделиться

Я использовал JSAP. Я нашел, что он стабилен и хорошо зарегистрирован.

я не уверен, что понимаю то, что Вы подразумеваете "под встроенным заполнением клавишей Tab". Можно ли уточнить.

0
ответ дан Parag 27 November 2019 в 01:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: