0

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

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

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

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

你能帮我吗?

4

2 回答 2

0

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

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

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

这会将 PHP 值保存在someValueJavaScript 变量中。

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

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

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

于 2013-04-22T23:57:03.790 回答
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 转义。

根据我的经验,我只需要对 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')。你可以使用代码生成来输出一个值——然后当你准备好保存时,将它发送回服务器一个页面方法(或 Web 服务)调用并将所有这些参数视为可能在此过程中被篡改的用户输入。

于 2013-04-23T02:00:58.170 回答