Использование "%" в качестве подстановочного знака с фильтром безопасности ESAPI
Мы используем уровень безопасности ESAPI в нашем приложении. Мы также намеренно используем символ "%" для поиска по шаблону, переданного со стороны браузера. Это плохой выбор, и он перенесен как устаревший дизайн для простого создания SQL для запуска на бэкэнде.
Теперь символ "%" на входе отклоняется валидатором ESAPI, чтобы предотвратить атаки с двойным кодированием. Мы активно следуем идее заменить "%" на что-то вроде "*". Но пока что, чтобы разрешить использование "%" для поиска с подстановочными знаками, мы взвешиваем наши параметры среди следующих:
1) Отключение канонизатора ESAPI. (Плохая идея, оставляет место для двойного кодирования.)
2) В слое безопасности замените все символы "%" каким-нибудь маловероятным символом перед проходом фильтра. Затем вернитесь назад. (У людей разные мнения на этот счет; некоторые думают, что это так же хорошо, как отсутствие защиты от атаки с двойным кодированием, другие считают, что это имеет определенную ценность.)
3) В клиентском приложении позвольте пользователю ввести "%", но перед отправкой на сервер замените его на "*". Нужно будет снова манипулировать '*' как '%' на уровне DAO. Потребуется большинство изменений кода во всем коде пользовательского интерфейса, которые могут принимать подстановочные символы.
Хотел бы пригласить ответы о том, как лучше всего решить эту проблему. Ценю любую помощь.
1 ответ
Это плохой выбор, и он перенесен как устаревший дизайн для простого создания SQL для запуска на бэкэнде.
Это указывает на то, что ваша корневая проблема не MixedEncodingException
и что это SQL инъекция. (SQLI)
Перепишите запросы на сервере для использования PreparedStatements
, Единственное гарантированное решение для предотвращения инъекционных атак - это правильное кодирование для правильного контекста. Поскольку вы используете пользовательский ввод для построения запроса SQL, правильным контекстом является SQL.
Насколько MixedEncodingException
Ваша лучшая ставка - вариант 3. Вы можете просто кодировать HTML в процентах. изменять %
с %
тогда теоретически ваша полезная нагрузка будет содержать только данные в кодировке HTML.
Но имейте в виду, что любое преобразование, которое вы делаете на клиенте, является видимым для злоумышленника, и я бы потянул этот поток. Сначала исправьте SQL i, а потом позаботьтесь о MixedEncoding.