2009-03-22 4 views
1

У нас есть веб-приложение J2EE usig Spring MVC. У нас есть новое требование для нашего веб-приложения, где мы должны удалить определенные заранее определенные символы из пользовательского ввода. Например, предположим, что приложение должно удалить «<» со всех пользовательских входов. Я пришел с 2 подходов для удовлетворения этого требования:Как удалить предопределенные символы из пользовательского ввода в веб-приложении J2EE?

  1. JSP Level: идентифицировать каждую JSP, которая позволяет пользовательский ввод, а затем удалить символы на стороне клиента.

  2. Сервлет-фильтр: используйте фильтр и перехватите объект запроса. Здесь я могу использовать один из следующих двух подходов:

    2.1: Переопределите метод request.getParameter и напишите в нем логику удаления символов. Всякий раз, когда этот метод вызывается, он возвращает результат фильтрации.

    2.2: На уровне фильтра сканируйте карту параметров и отфильтруйте требуемые символы. Затем напишите метод setParameter и установите новые значения в карте параметров запроса.

Какой подход вы предлагаете? Будет ли фильтр влиять на производительность? Если вы можете подумать о лучшем подходе, пожалуйста, дайте мне знать.

+0

Из любопытства вы делаете это с точки зрения безопасности? –

ответ

2

Вы можете сделать фильтрацию на стороне клиента, если хотите, но вы абсолютно не должны полагаться на него. Клиенты могут отключить Javascript. Они также могут просто размещать то, что им нравится, когда дело доходит до него. Валидация на стороне клиента - это удобство. Это не заменяет проверку на стороне сервера.

Что касается использования сервлет-фильтров, я не уверен, что я большой поклонник этого. Похоже, (и я мог ошибаться здесь), вы пытаетесь защитить себя от ленивых, забывчивых или просто неумелых разработчиков.

Также, если вы разрешаете HTML в любой точке (например, этот сайт), вы не можете внедрить такую ​​вещь как универсальное правило. Такие вещи следует обрабатывать там, где вы выполняете всю свою проверку. Поставьте единичные тесты вокруг него, если вы действительно беспокоитесь об этом.

Сервлет-фильтры просто кажутся тяжелыми и, возможно, проблематичными для этого.

Вы используете Spring MVC. Используете ли вы какую-либо специальную систему проверки валидаторов Spring? Независимо от того, ИМХО, это правильное место для решения этой проблемы и легко проверяемой единицей [sic].

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

Все, что сказано, я не вижу каких-либо технических причин, по которым вы не могли бы сделать это с помощью setParameter в фильтре сервлета, если вы действительно так склонны к этому подходу. Я бы, конечно, сделал это над переопределением setParameter в запросе сервлета. Можете ли вы это сделать? Даже если ты не сможешь.

+0

Мы используем фреймворк Spring MVC. Я также добавил его к вопросу. Thankx. –

0

Я предлагаю вам использовать для этого регулярные выражения.

Насколько это возможно, это похоже на бизнес-логику, поэтому сервлет-фильтры или уровень jsp не звучат как очень хорошая идея.

Да, это повредит работе, но это не будет заметно или критично.

1

Я бы повернул вопрос о лице. Является ли проблема, что пользователи вводят символы, такие как <, в поля или тот факт, что вы не избегаете их, когда вы распечатываете их снова на веб-странице?

+0

Пользователи могут вводить символы. Клиент не хочет хранить их в БД. Они также не хотят показывать какое-либо предупреждение или сообщение, чтобы информировать пользователя о том, чтобы не вводить такие символы. –

0

Я просто читал другой StackOverflow пост, который мог бы помочь здесь с помощью Servlet Фильтр:

Modify Request Parameter with Servlet Filter

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