Защита против вставки SQL-атаки - PullRequest
0 голосов
/ 26 октября 2011

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

Я параметризирую оператор вставки, но имя настраиваемой таблицы будет использоваться в операторе вставки, и это потенциальный вектор для атаки. Вот пример оператора, который будет построен:

"insert into " + theTableName + " (static column list) values(parameterized list of values)"

Так что мои вставленные значения параметризованы и довольно безопасны, это theTableName, которое может содержать неприятности.

Мой вопрос: что я могу сделать, чтобы очистить имя таблицы? Я думаю, что природа кода, который злоумышленник может внедрить, должна немного отличаться от разновидности сада. - вместо галочки вы могли бы потенциально закрыть статистику "table name () values ​​(); сделать что-то плохое -

(или что-то подобное, я полагаю). С этой целью я думал о проверке «;» и «-».

Может кто-нибудь предложить лучший способ дезинфицировать это? (это будет использоваться с Oracle и SQL-сервером)

Ответы [ 5 ]

2 голосов
/ 26 октября 2011

Это по-прежнему не защищает вас от UNION-атак (и еще нескольких).Лучше всего выполнить проверку белого списка латинских букв или аналогичных символов, если вы знаете, что разрешено.

Другие проверяемые символы:

()`"'

и пробел.

1 голос
/ 27 октября 2011

Для меня очевидным решением будет проверка имени таблицы, которую вы собираетесь использовать в динамическом SQL, сначала с использованием статического SQL:

select * from sys.tables where name = @thetablename

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

1 голос
/ 26 октября 2011

почему бы не использовать числовое значение theTableID для строки, в которой вы храните имя таблицы theTableName.Вы можете сохранить это числовое значение идентификатора в файле конфигурации на ПК пользователя и передать его в приложение.Затем вы можете просмотреть его с помощью параметризованного запроса, а затем объединить фактическое имя таблицы строк в запросе.Это будет безопасно.

1 голос
/ 26 октября 2011

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

Поэтому я бы сделал это:

  1. Создайте строку INSERT (включая имя таблицы) только один раз при загрузке файла конфигурации.

  2. Проверьте имя таблицы при этомвремя, проверяя системные метаданные, чтобы убедиться, что это реальная, действительная таблица.

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

0 голосов
/ 26 октября 2011

Я предполагаю, что главный вопрос в том, почему переменная TableName даже выставляется человеку, использующему страницу, для которой ведется запись в журнал.

За исключением этого, проверка белого списка выполняется либо по набору массивов значений, либо по набору, который вы создаете на лету, запрашивая системный каталог для имен таблиц и сбрасывая их в массив и все, что делает .Contains(theTableName) в массиве или любой другой эквивалент для выбранного языка, вероятно, самый безопасный способ.

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