2012-02-08 4 views
2

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

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

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

Любая идея, что я делаю неправильно?

ответ

1

Попробуйте

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

А что, если значение содержит символ кавычки? – RoToRa

+0

Вы должны обрабатывать его в фоновом режиме. – czerasz

+0

«czerasz» - спасибо, вот и все! – user1197071

3

Подумайте о том, что делает ваш код. Собственно, не думай об этом, посмотри на него. Откройте исходный код своей страницы, когда он отображается в браузере. Если предположить, что атрибут сеанса содержит значение 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> 

И теперь ваш сайт будет не только показывать «Этот сайт дерьмо !» большими буквами, но заблокирует пользователя в бесконечном цикле предупреждающих ящиков. (Это называется Cross-Site Scripting)

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

Смотрите также, например:

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