2013-04-22 87 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服务)调用把它发送回服务器并且处理所有这些参数作为有可能的用户输入,可能在一路上被篡改