从javascript安全发送会话?

时间:2015-06-03 20:54:42

标签: c# .net asp.net-web-api

嗯,我觉得这个问题有点奇怪,因为我不确定这个问题是否适合这个问题。

好的,进入问题..

我有这段代码

<script>
var session = "<%= Session["User"]%>";
</script>

所以,我在想,这样安全吗?让我告诉你我的意思..

我有一个web api,你可以通过他的Session得到名字,姓氏,年龄和用户的一切,我可以发送这个web api这个会话并使用它吗?

这样做是否安全?在安全问题上?如果没有,有没有更好的方法?

编辑1:

我想要完成什么?简单,我将UserId存储在会话中,UserId将Guid,当用户在javascript中发送时可以发送帖子到API服务器获取信息,API将从会话中发送UserId。

可以吗?

2 个答案:

答案 0 :(得分:2)

您描述的工作流程看起来很好。对我来说,使用一些ID获取有关某些用户的更多信息似乎是安全的,特别是如果这应该是一个API,至少,Facebook API使用这样的原则而不是害怕一些黑客:)

我主要关注的是当您尝试混合代码和查看哪种不好时的编码风格。如果你真的需要在客户端和服务器端之间共享一些信息,那么我会选择其中一个选项。

选项#1 - Cookie

What is the difference between a Session and a Cookie?

您可以在Cookie中保留一些简单的信息并以此方式获取:

  • 客户:$ .cookie('ID')
  • 服务器:Response.Cookies [“ID”]

在这种情况下,没有必要弄乱你的客户端JS与C#代码和cookie将保存在用户PC上,这意味着没有人会看到他们除外。

选项#2 - 模板

  • 服务器:将所有需要的信息放入隐藏表单或ViewState
  • 客户:使用HTML选择器从隐藏表单中获取信息

直接回答:

一般情况下,如果您只担心安全性,那么可以使用此代码,它不应该破坏您网站的安全性。

虽然,我个人不喜欢这种方法,因为:

  • 您将混合代码和视图,创建MVC以分割它们
  • 目前尚不清楚您在视图中的确切位置会放置此代码,因此不清楚您将如何检查此变量是否已初始化
  • 可能会发生一些会破坏JS语法并导致JS错误的值

在我个人看来,我会用上面提到的选项之一替换它。

选项1 - MVC + JQuery + Cookie示例

public ActionResult Index()
{
    string demo = Request.QueryString["MyNameSpace.ID"]; // get value from client
    Response.Cookies["MyNameSpace.ID"].Value = "server"; // change value in response
    return View();
}

然后在你的JS文件中:

$(document).ready(function() {            // make sure server rendered page
    var ID = $.cookie('MyNameSpace.ID');  // get cookie value from server
    $.cookie('MyNameSpace.ID', 'client'); // update, on the next request server will get it
});

选项2 - MVC + JQuery +模板示例

public class OptionsModel // View Model
{
    public string ID { get; set; }
    public string User { get; set; }
}

public ActionResult Index() // Controller
{
    OptionsModel options = new OptionsModel();
    options.ID = "server";
    return View(options);
}

您的观点:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<OptionsModel>" %>

<%=Html.HiddenFor(m => Model.ID, new { @class = "MyNameSpace:ID" })%>
<%=Html.HiddenFor(m => Model.User, new { @class = "MyNameSpace:User" })%>

然后在你的JS文件中:

$(document).ready(function() {              // make sure server rendered page
    var options = $('[class^=MyNameSpace]') // get values from hidden fields
    options[0] = 'client';                  // update data
    $.ajax({ data : options });             // create handler to send data back to server
});

Web表单的示例没有显着差异。

答案 1 :(得分:-1)

您发布的代码将在页面上呈现,因为当它到达客户端时(假设您使用的是ASP.NET

<script>
     var session = "John Smith";
</script>

这是因为使用了服务器端脚本标记&lt;%=%&gt; (https://technet.microsoft.com/en-us/library/cc961121.aspx

作为一个注释,如果这是你的意图,那么将会话完全公开给javascript可能不是最好的事情。在一天结束时,它取决于你在那里存储和使用它(但ASP.NET也将它用于某些事情)但暴露它只是打开了另一个区域供攻击的人。

http://www.owasp.org是了解保护网站安全的好地方。