безопасно ли использовать java .text.MessageFormat.format () при создании запроса sql? - PullRequest
0 голосов
/ 28 января 2020

Я использую MessageFormat.format () , чтобы создать строку для моего PreparedStatement. Я читал, что использование StringBuilder может быть причиной sql инъекции. То же самое для MessageFormat?

код выглядит так

String SQL
        = "select CT.SYS_CHANGE_OPERATION, CT.{0} as ID, t.*\n"
        + "from changetable (changes {1}, ?) as CT \n"
        + "left outer join {2} as t \n"
        + "on t.{3} = CT.{4} \n"
        + "order by CT.SYS_CHANGE_VERSION";

String finalSQL = MessageFormat.format(SQL, primaryKey, table, table, primaryKey, primaryKey);
        PreparedStatement pstmt = con.prepareStatement(finalSQL);

Ответы [ 2 ]

1 голос
/ 28 января 2020

Это не безопасно. MessageFormat.format просто заменяет вхождения {x} в заданной строке на заданные объекты без экранирования последнего. Следовательно, это эквивалентно конкатенации строк.

Чтобы построить запрос SQL, содержащий данные из переменных, всегда следует использовать подготовленные операторы.

0 голосов
/ 28 января 2020

Создание строки SQL, как при заполнении имен таблиц и столбцов будет небезопасным (SQL инъекция), только если переменные строки происходят из некоторого переданного ввода.

Следовательно, StringBuilder может быть даже более звучным (чистым), чем MessageFormat. С другой стороны, формат более читабелен.

Поскольку именованные заполнители были бы еще лучше, рассмотрим Apache Общие StringSubstitutor или что-то подобное.

В каждом случае средства проверки кода могут предупреждать о SQL внедрение в это.

Иногда вы можете использовать

DatabaseMetaData metaData = connection.getMetaData();

и использовать имена таблиц и столбцов для работы с метаданными.

Это в основном поставщик БД независимый способ JDB C для запроса базы данных.

...