Анализировать строковые литералы из исходных файлов Java, чтобы найти потенциальные SQL-инъекции - PullRequest
4 голосов
/ 21 марта 2011

В нашем Java-проекте мне нужно найти потенциальные SQL-инъекции в исходных файлах java.

Мы используем наш собственный интерфейсный интерфейс Java-SQL, и все соответствующие SQL-запросы имеют следующую форму:

String someText = "potential SQL injection";
SQL.selectInto(
    "SELECT C.LANGUAGE,  " +
    someText +
    "FROM   COMPANY C " +
    "WHERE  C.COMPANY_NR = :companyNr " +
    "INTO   :languageUid ",
    new NVPair("companyNr", companyNr),
    new NVPair("languageUid", languageUid)
);

Проблема в том, что переменная "someText" потенциально может содержать другую строку SQL, которая может вызвать SQL-инъекцию.

Я ищу способ (регулярное выражение, Javaсинтаксический анализатор и т. д.), чтобы найти все строковые литералы java с SQL в нем, которые имеют некоторую конкатенацию строк, которая может содержать фрагмент SQL, так что я мог бы проверить эти экземпляры вручную и переписать их при необходимости.

Я предполагаю, что SQL-stmts используются только с классом-помощником SQL, например:

SQL.select(...)
SQL.insert(...)

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Если someText всегда является списком столбцов, вы можете выполнить некоторую проверку для него.(Даже если он отличается от списка столбцов, вы можете выполнить некоторую проверку).Как минимум, вы можете разделить его на запятые и убедиться, что каждый элемент в результирующем массиве является допустимым именем столбца.Это предотвратит внедрение SQL в этом пространстве.

Почему вы не упомянули об этом в companyNr и languageUid?Вы там что-то делаете за кулисами?

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

1 голос
/ 21 марта 2011

Если в выбранных вами таблицах нет неприличного количества столбцов, вы можете использовать someText для выбора определенных столбцов из набора результатов после возврата информации из всех столбцов.

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

1 голос
/ 21 марта 2011

Может быть этот вопрос помогает.

Быстрый и простой подход может заключаться в проверке того, содержит ли предоставленная строка какие-либо значения SELECT, INSERT, UPDATE или DELETE (без учета регистра). Без этих подзапросов не должно работать, и если пользователь предоставит что-либо еще, кроме правильного синтаксиса для выбранных полей, запрос не сможет скомпилироваться.

Кроме того, пользователь, который выполняет операторы (скорее всего, какой-то системный пользователь), не должен иметь привилегий для изменения структуры базы данных, т. Е. Вообще никаких операторов DROP, ALTER XYZ и т. Д.

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