【问题标题】:Is sending Session from javascript safe?从javascript发送会话安全吗?
【发布时间】:2015-08-18 06:40:45
【问题描述】:

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

好的,进入问题..

我有这个代码

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

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

我有一个 web api,你可以通过他的 Session 获取用户的姓名、姓氏、年龄和所有关于用户的信息,我可以在这个 session 中发送这个 web api 并使用它吗?

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

编辑 1:

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

这样好吗?

【问题讨论】:

  • 可能不会。如果这就是您用来验证某人是否在会话中的全部内容,那么它可能会被拦截。
  • 我该怎么做,你能告诉我吗?
  • 你执行那行代码的目的是什么?
  • 这是XY Problem。你真正想要完成的是什么?为什么一定要感觉需要将 Session 变量发送到其他页面?
  • 请记住,javascript 中可见的所有内容都可能被黑客拦截。因此,将会话中的 UserId 作为 API 使用的唯一信息是不明智的。最好将 OAuth2 之类的东西与您的 API 可以解密和解析以获取值的令牌一起使用。加密/解密的密钥只能在服务器端使用 - 隐藏在黑客的窥探之下。

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


【解决方案1】:

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

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

这是由于使用了服务器端脚本标签 (https://technet.microsoft.com/en-us/library/cc961121.aspx)

作为一个注释,如果这是您的意图,那么将会话完全暴露给 javascript 可能不是世界上最好的事情。归根结底,这取决于您在其中存储的内容和使用它的目的(但 ASP.NET 也会将它用于某些事情),但暴露它只会为某人打开另一个攻击区域。

http://www.owasp.org 是了解有关保护您的网站的更多信息的好地方。

【讨论】:

  • 这不会将会话暴露给 JavaScript。它公开了用户的名字(或任何Session["User"].ToString() 产生的名字)。不可能将“会话”暴露给 JavaScript,因为 is 没有这样的东西。可以公开会话 ID,但这没什么大不了的,因为它已经在 cookie 中公开了。
  • 这是我在脚本标签中突出显示的内容。其余的只是关于从可能不需要公开的网站公开信息的一般警告。就因为会话 id 已经暴露,你真的想像旗帜一样飘扬它吗?
  • 我认为假设黑客具有基本的情报水平是可以的。否则,您将面临低估它们的风险。
  • 没有人说过低估黑客的能力。这更像是一个安全最佳实践案例。
【解决方案2】:

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

我主要关心的是当你尝试混合代码和视图时的编码风格不好。如果您确实需要在客户端和服务器端之间共享一些信息,那么我会选择这些选项之一。

选项 #1 - Cookies

What is the difference between a Session and a Cookie?

您可以在 cookie 中保存一些简单的信息并通过这种方式获取:

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

在这种情况下,无需使用 C# 代码将您的客户端 JS 弄得一团糟,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 表单的示例没有显着差异。

【讨论】:

  • 我不确定你的意思,。这是好方法吗?还是不做?
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多