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

本文关键字:变量 获取 数据 服务器端 JS | 更新日期: 2023-09-27 18:10:20

我想从服务器端存储数据在客户端变量,这是一个很好的做法吗?

我有一个使用web服务的应用程序,我不想在源代码上暴露ip,所以如果我能设置一个客户端变量与该ip,那将是很好的。

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

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

你能帮我吗?

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

在客户端保存服务器端数据本身并没有什么错。

这里有一个简单的方法,对于PHP:

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

someValue JavaScript变量中保存一个PHP值。

对于更复杂的数据结构,下面是两种语言之间转换的好方法:

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

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

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 >

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

在我的经验中,我只需要为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和对流控制的攻击(if语句不能真正保护ShipTheGoods,防止在没有密码的情况下被调用)

无论如何,在JS页面中,跟踪状态(即Session)的方式只是一个变量,"var customerInFocus = 'joe'"。您可以使用代码生成来输出一个值——然后当您准备保存时,通过pagememethod(或web服务)调用将其发送回服务器,并将所有这些参数视为可能在此过程中被篡改的用户输入。