Javascript - session.getAttribute возвращает неопределенное значение - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть форма JSP, которая читает входные данные пользователя и вызывает Java-сервлет для обработки данные. После обработки данных вызывается session.setAttribute для хранения важной информации. Затем в Javascript я пытаюсь прочитать переменную сеанса и отобразить это на экране. Код выглядит следующим образом (часть кода удалена):

<script type="text/javascript">
   var test = <%= session.getAttribute( "mySessionVar" ) %>;
   document.write (test);
}

Когда пользователь вводит целое число в форму, все работает как положено, и вывод отображается на экране правильно. Тем не менее, когда пользователь вводит строку в форме, «undefined» отображается на экране.

Есть идеи, что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 08 февраля 2012

Подумайте о том, что делает ваш код.На самом деле, не думай об этом, посмотри на это.Откройте исходный код вашей страницы, когда он отображается в браузере.Предполагая, что атрибут сеанса содержит значение hello, ваш код сгенерирует

<script type="text/javascript">
   var test = hello;
   document.write (test);
</script>

, поэтому значение будет интерпретироваться как переменная JavaScript.А поскольку вы, скорее всего, не определили переменную с именем hello, это приведет к undefined.

Однако, если вы теперь добавляете только кавычки:

var test = "<%= session.getAttribute( "mySessionVar" ) %>";

тогда вы 'Все еще будет небезопасно, поскольку, как вы говорите, значение приходит от вашего пользователя, тогда оно может содержать не только сами кавычки, но также и код JavaScript или даже код HTML.

Представьте, что ваш пользователь вводит "; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1> (обратите внимание на символ кавычки в начале!)

Вывод вашего исходного кода, содержащего:

<script type="text/javascript">
    var test = ""; while(1) {alert('This site is crap!')};</script><h1>This site is crap!</h1>

И теперь ваш сайт будетне только отображать "Этот сайт дерьмо!"большими буквами, но заблокирует пользователя в бесконечном цикле предупреждений.(Это называется Межсайтовый скриптинг )

Правило номер один в веб-разработке, НИКОГДА НИКОГДА не выводит ничего (особенно пользовательского ввода), которое не было экранированодолжным образом.Используйте StringEscapeUtils.escapeJavaScript для JavaScript и c:out для HTML.

См. Также, например:

PS: Я надеюсь, что если вы используете базу данных, вы правильно избегаете операторов SQL, иначе люди могут очень просто получить доступ к вашей базе данных и серверу (это называется SQL-инъекция )

1 голос
/ 08 февраля 2012

Попробуйте это

var test = '<%= session.getAttribute( "mySessionVar" ) %>';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...