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