где мы должны разместить переменную HIDDEN в JSP - PullRequest
1 голос
/ 18 марта 2010

Мне нужно использовать скрытые переменные в моем JSP для отслеживания сеанса. Это код:

<input type="hidden" name="REQ_TOKEN" value="<%=session.getAttribute("SESN_TOKEN").toString()%>" />

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

Теперь проблема в том, что когда я помещаю этот код в теги <form></form>, он работает нормально. К сожалению, в моем приложении есть несколько JSP, у которых нет тега <form> (я знаю, это звучит странно!). Где я могу разместить свой код, чтобы он работал?

Разве я не могу использовать скрытые переменные без тега <form>?

Ответы [ 3 ]

1 голос
/ 18 марта 2010

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

Во-первых, как вы отправляете запросы без <form>? Пользователь просто щелкает ссылку? Если это так, вы можете добавить одноразовый номер в строку запроса, но если вы используете GET-запросы для чего-то разрушительного, что на самом деле требует проверки одноразового номера, вы делаете это неправильно. Эти типы запросов должны выполняться только через POST, что подразумевает генерацию <form method="post">.

Во-вторых, нет, вы не можете использовать <input type="hidden" /> вне формы. Данная форма представляет только свои собственные значения, то есть элементы между <form> и </form>.

Если вы хотите, чтобы ваше скрытое значение было включено в отправляемые данные, вы должны включить скрытый ввод в отправляемую форму. Если, как вы говорите, вы не можете включить необходимые теги <form> в файлы JSP, вы можете динамически выполнить запрос через Javascript, но это вводит зависимость от Javascript, которую следует избегать из-за чего-то такого простого и фундаментального.

0 голосов
/ 18 марта 2010

Если это просто для предотвращения CSRF, то вам это вообще не нужно на бесформенных страницах. Просто потому, что защищать нечего :) Смысл в том, чтобы включить его в каждую <form method="post">, а не в каждую страницу .

Тем не менее, «отслеживание сеанса» - это совершенно другое понятие. HttpSession уже делает именно это за кулисами с помощью cookie или перезаписи URL. Вот почему я нашел ваш вопрос изначально запутанным и разместил комментарий для разъяснения. Здесь вы просто хотите «отслеживать запросы» с помощью маркера на основе запроса, который вы сохраняете в области сеанса (и удаляете сразу после прохождения запроса), чтобы вы могли предотвратить CSRF.

Обновление : вы можете найти этот ответ полезным, чтобы узнать больше о том, что такое CSRF на самом деле.

0 голосов
/ 18 марта 2010

Насколько я знаю, вам нужно иметь скрытое поле в теге формы, чтобы оно работало правильно. Все еще ища, будет repost. Сайты, которые я нашел, говорят, что они должны быть в форме.

EDIT * roseindia.net / JSP / jspsession / HiddenForm

...