2012-02-08 134 views
2

我有一个JSP表单,它从用户读取输入并调用Java servlet来处理 数据。一旦数据被调用,session.setAttribute被调用来存储重要信息。然后在Javascript中,我尝试读取会话变量并在屏幕上显示 。的代码看起来是这样的(一些代码移除):Javascript - session.getAttribute返回未定义的值

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

当用户输入的形式的整数,所有按预期方式工作并正确显示在屏幕上的输出 。但是,当用户在表格中输入字符串时,屏幕上将显示“ ”undefined“

任何想法我做错了什么?

回答

1

试试这个

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

如果该值包含引号字符? – RoToRa 2012-02-08 13:11:05

+0

你必须在后端处理它。 – czerasz 2012-02-08 13:21:16

+0

“czerasz” - 谢谢你,就是这样! – user1197071 2012-02-08 23:26:53

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

web开发中的第一条规则,从来没有输出任何(尤其是不是用户输入),没有正确转义。 HTML使用StringEscapeUtils.escapeJavaScript,HTML使用c:out

参见例如:

PS:我希望,如果你使用一个数据库,你逃避你SQL语句正确,否则人们可以非常简单地访问到您的数据库和服务器(称为SQL injection