我想将数据从服务器端存储在客户端变量中,这是一个好习惯吗?
我有一个使用 Web 服务的应用程序,我不想在源代码上公开 ip,所以如果我可以使用该 ip 设置客户端变量会很好。
现在有人告诉我,例如从 Session 获取值并将它们存储在 JS 变量中可能被称为“坏事”,因为它代表一个 XSS 漏洞,我不希望我的网站被标记为“不安全” .
我想将值存储在客户端变量上的原因是我可以使用 JQUERY - AJAX,这样客户端就不必为每个请求重新加载页面。
你能帮我吗?
我想将数据从服务器端存储在客户端变量中,这是一个好习惯吗?
我有一个使用 Web 服务的应用程序,我不想在源代码上公开 ip,所以如果我可以使用该 ip 设置客户端变量会很好。
现在有人告诉我,例如从 Session 获取值并将它们存储在 JS 变量中可能被称为“坏事”,因为它代表一个 XSS 漏洞,我不希望我的网站被标记为“不安全” .
我想将值存储在客户端变量上的原因是我可以使用 JQUERY - AJAX,这样客户端就不必为每个请求重新加载页面。
你能帮我吗?
在客户端保存服务器端数据本身并没有错。
对于 PHP,这是一个简单的方法:
<script>var someValue = "<?php echo $some_value; ?>";</script>
这会将 PHP 值保存在someValue
JavaScript 变量中。
对于更复杂的数据结构,这是一种在两种语言之间转换的好方法:
<script>var someValue = JSON.decode("<?php echo json_encode($some_value); ?>");</script>
仅当您要保存客户端的数据敏感时,这才成为一个坏主意。没有办法说出你的意图是什么,所以你必须使用你最好的判断。
JS中的代码生成
<script >
<%= SomeMethodFromCodeBehind() %> //JS goes here.
</script >
只生成数据的代码
<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 服务)调用并将所有这些参数视为可能在此过程中被篡改的用户输入。