2012-02-08 233 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