2010-03-18 3 views
1

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

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

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

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

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

+0

Я думаю, код там не отображается, вот он: " /> micheal

+0

Этот подход пахнет. Для чего тебе это? Разве вы не изобретаете то, что уже делает «HttpSession»? Если это только для предотвращения CSRF, то вам это совсем не нужно на бесформенных страницах. – BalusC

+0

@ Balus C, я пытаюсь остановить подделку подпроса с помощью этого кода. – micheal

ответ

1

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

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

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

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

0

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

EDIT * roseindia.net/jsp/jspsession/HiddenForm

+0

Следует отметить, однако, что статьи на roseindia.net обычно вводят плохие методы кодирования до необычайно высокой степени по сравнению с другими сайтами/блогами. Сайт * может содержать хорошую техническую информацию, но примеры кода должны быть приняты с чрезвычайно высокой осторожностью. Это проблематично, когда вы все еще зеленые/новые для всего материала и, следовательно, не знаете, что «хорошо», а что «плохо». – BalusC

+0

@BalusC Спасибо за подсказку. Я по-прежнему довольно новичок в кодировании и ценю любые советы и помощь, которые я получаю. на этой ноте, есть ли блоги и/или сайты, которые вы могли бы мне порекомендовать для правильных процедур кодирования, а не для быстрого исправления. Мне трудно найти сайты, которые объясняют, что делать. Я обычно код в php, html, .net framework, java, mysql. Я посещаю php.net, w3schools и другие подобные сайты, но у меня проблемы с поиском блогов или форумов, которые дают больше ответов, чем задавать вопросы. –

0

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

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

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

+0

Спасибо за ответ ура BalusC, Не нужно заботиться о проблемах CSRF на веб-странице, у которой нет тега FORM ?? В моем случае у меня есть JSP, у которых нет тегов FORM, они отправляют страницу с помощью HYPERLINKS (window.open/window.location). Я все еще могу реализовать исправление CSRF (сравнивая токен REQ с токеном сеанса), который я делаю прямо сейчас, добавив токен в URL. Но насколько безопасно это показывать (по URL) токен REQ для пользователя ??? – micheal

+0

Window.open и window.location только fire GET запросы, и они безвредны (по крайней мере, должны быть безвредными), поэтому нет риска CSRF. Но если они действительно выполняют чувствительные действия, такие как удаление/обновление чего-либо в базе данных, то это был уже неправильный выбор для использования window.open/window.location для него. В любом случае, похоже, что вы все еще не понимаете ключ CSRF. Я предлагаю снова прочитать опубликованную ссылку. – BalusC