2013-04-22 144 views
0

我想將數據存儲在服務器端的客戶端變量中,這是一個很好的做法嗎?從JS變量的服務器端變量中獲取數據?

我有一個使用Web服務的應用程序,我不想在源代碼上公開IP,因此如果我可以使用該IP設置客戶端變量,那將會很好。

現在有人告訴我,例如從Session獲取值並將它們存儲在JS變量中可能被稱爲「壞事」,因爲它代表了XSS Hole,我不希望我的網站被標記爲「不安全」的。

我想將值存儲在客戶端變量的原因是,我可以使用JQUERY-AJAX,以便客戶端不必爲每個請求重新加載頁面。

你能幫我嗎?

+2

用戶可以使用Javascript控制檯訪問客戶端中的任何內容,因此如果你不想公開IP,它需要在一個服務器變量中。 – Barmar 2013-04-22 23:50:39

回答

0

在客戶端保存服務器端數據沒有任何內在的錯誤。

這裏有一個簡單的方法,爲PHP:

<script>var someValue = "<?php echo $some_value; ?>";</script> 

這節省了someValue JavaScript變量PHP的值。

對於更復雜的數據結構,這裏是一個很好的方式在兩種語言之間轉換:當數據要保存客戶端是敏感

<script>var someValue = JSON.decode("<?php echo json_encode($some_value); ?>");</script> 

這隻能成爲一個壞主意。沒有辦法說出你的意圖是什麼,所以你必須用你最好的判斷。

0

碼生成JS

<script > 
<%= SomeMethodFromCodeBehind() %> //JS goes here. 
</script > 
  • 優點:您可以訪問所需的服務器上的所有內容。
  • 缺點:您正在使用C#編寫JS,並且C#字符串方法不完全是模板引擎。
  • 你會認爲你有權訪問會話,但只在代碼創建時!
  • 如果您將用戶輸入混合到結果中,那麼這就是「JavaScript注入」,它與XSS混合在一起。

碼產生不僅僅是數據

<script > 
var myNumber = parseInt(<%= Convert.ToInt32(Session["TheNumber"]) %>,10); 
var id = '<% TextBox.ClientID %>'; 
</script > 

以上只是生成數據,而不是所有的代碼,所以它更容易看到什麼是潛在的用戶輸入(也許是會議的部分),然後強制它到一個合適的數據類型,或做一些JS逃避字符串。

根據我的經驗,我只需要爲ClientIDs以及有時沒有客戶端API的控件的屬性執行此操作。

呼叫服務

如果沒有代碼生成的函數,返回42,也許你可以在服務器上保留的功能,只是有JS收集參數。首先,調用Web服務不會受到XSS的影響 - 用戶將不得不攻擊Web服務的參數,在代碼生成中,如果用戶只能弄清楚如何在代碼生成中進行各種攻擊得到他的代碼輸出(尤其是某人的瀏覽器)。所以現在你可以創建一個JS友好的Web API。這裏有一些事情可能出錯:

<script > 
//Things that used to be somewhat secret are potentially public now. 
PageMethods.GetSesion("Blah",onSuccess); 

//Wow, something that used to be hard for the user to tamper with is now convenient to 
//tamper with. Now Session is ALL user input (and hence evil) 
PageMethods.SetSession("Blah",42); 

//Okay, now the user has the ability to read your secrets, conveniently 
PageMethods.Encrypt("Blah", onSuccess); 
PageMethods.Decrypt("Blah", onSuccess); 
if(password=="xyzzy") 
{ 
    PageMethods.ShipTheGoods(address,goods); //User can call this directly. 
} 
</script > 

(我不是促進PageMethods,但他們肯定是比其它示例代碼短)

上面的代碼排序是另一個常見的問題,噹噹你習慣編寫服務器端代碼時,你編寫JS代碼。有一本書稱這個過於細化的API和對流量控制的攻擊(即如果聲明不能真正保護ShipTheGoods不被密碼調用)

無論如何,在JS頁面中,跟蹤狀態的方式(即Session )只是一個變量,「var customerInFocus = 'joe')你可以使用代碼生成來輸出一個值 - 然後當你準備好保存時,通過pagemethod(或者web服務)調用把它發送回服務器並且處理所有這些參數作爲有可能的用戶輸入,可能在一路上被篡改