从JS变量中获取服务器端变量的数据?

时间:2013-04-22 23:45:17

标签: c# javascript

我想将数据存储在服务器端的客户端变量中,这是一个好习惯吗?

我有一个使用Web服务的应用程序,我不想在源代码上公开ip,所以如果我可以使用该ip设置客户端变量会很好。

现在有人告诉我,例如从Session获取值并将它们存储在JS变量中可能被称为“坏事”,因为它代表了一个XSS Hole,我不希望我的网站被标记为“不安全的“一个。

我想将值存储在客户端变量上的原因是我可以使用JQUERY - AJAX,这样客户端就不必为每个请求重新加载页面。

你可以帮帮我吗?

2 个答案:

答案 0 :(得分: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>

当您要保存客户端的数据敏感时,这只是一个坏主意。没有办法说出你的意图是什么,所以你必须用你最好的判断。

答案 1 :(得分:0)

JS中的代码生成

<script >
<%= SomeMethodFromCodeBehind() %> //JS goes here.
</script >
  • 优点:您可以访问服务器上所需的所有内容。
  • 缺点:您正在使用C#编写JS,而C#字符串方法并不是模板引擎。
  • 您会认为您可以访问Session,但仅限于代码生成时间!
  • 如果您将用户输入混合到结果中,那么这就是“JavaScript注入”,它与XSS混在一起。

仅生成数据的代码

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

上面只是生成数据,而不是所有代码,因此更容易看到什么是潜在的用户输入(可能是Session部分),然后强制它为合适的数据类型,或者对字符串进行一些JS转义。 / p>

根据我的经验,我只需要为ClientID执行此操作,有时也需要没有客户端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服务)调用将其发送回服务器,并将所有这些参数视为可能已被篡改的用户输入。