我有一个JSP表单,它从用户读取输入并调用要处理的Java servlet
数据。数据一旦被处理,就会调用session.setAttribute
来存储重要信息。然后在Javascript中我尝试读取会话变量并显示
它在屏幕上。代码看起来像这样(删除了一些代码):
<script type="text/javascript">
var test = <%= session.getAttribute( "mySessionVar" ) %>;
document.write (test);
}
当用户在表单中输入一个整数时,一切都按预期工作并输出 正确显示在屏幕上。但是,当用户在表单中输入String时, 屏幕上显示“undefined”。
知道我做错了什么吗?
答案 0 :(得分:4)
考虑您的代码的作用。实际上,不要考虑它,看看它。在浏览器中显示页面的源代码时,打开它。假设session属性包含值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)
Web开发中的头号规则,永远不会输出尚未正确转义的任何内容(尤其不是用户输入)。使用StringEscapeUtils.escapeJavaScript表示JavaScript,c:out
表示HTML。
另见例如:
PS:我希望,如果您正在使用数据库,那么您正在正确地转义SQL语句,否则人们可以非常简单地访问您的数据库和服务器(称为SQL injection)
答案 1 :(得分:1)
试试这个
var test = '<%= session.getAttribute( "mySessionVar" ) %>';