会话 ID 不够随机 - ASP.NET

2024-05-03

UPDATE

我们最终与 Acunetix 团队的一些程序员进行了会面,他们意识到他们的代码中可能存在一些错误,导致扫描中显示的问题比实际情况更严重。普遍的共识是忽略扫描结果并使用开箱即用的 ASP.NET 会话 ID 生成,因为它对于我们的站点来说应该足够安全。

@Vasile Bujac,因为您的答案是唯一的,并且提到使用 ASP.NET 标准解决方案,所以我将其作为答案,但感谢大家的帮助。


我们在工作中使用 Acunetix 的 Retina 扫描仪对我们的应用程序进行安全扫描。它告诉我们,我们的会话 ID 不够随机且太可预测。我不太确定 ASP.NET 默认情况下如何生成会话 ID(我认为它是 GUID?),但我继续实现了扩展 SessionIDManager 类并重写 CreateSessionID 和 Validate 方法以使用 Guid 的方法如中所解释的这篇 MSDN 文章 http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionidmanager.createsessionid.aspx.

虽然这使得它更加随机,但根据 Acunetix 的说法,它仍然没有产生“期望的”效果。我什至添加了regenerateExpiredSessionId="true"web.config 属性,但没有效果。我感觉我可能需要特意打电话Session.Abandon()真正清除会话并获得新的 ID。问题是我必须在用户登录之前调用它,因为这是了解用户正在开始新会话的唯一防故障方法。所以我无法在会话中设置任何内容,直到下一页按照以下方式加载Abandon方法有效,这意味着中间页面不是很理想,但可以解决问题。

有没有人经历过这种情况或成功实施了修复?

另外,仅供参考,我们不使用成员资格/表单身份验证,我们只是在有人登录时创建一个新的自定义用户类并将其保存在会话中以供以后使用。


Acunetix 的报告:

CWE-330 http://cwe.mitre.org/data/definitions/330.html CAPEC-59 http://capec.mitre.org/data/definitions/59.html OWASP2007-A7 https://www.owasp.org/index.php/Top_10_2007-A7

描述:表现出低熵(“随机性”)的会话令牌通常容易受到预测攻击。不安全的令牌可能是由于伪随机数生成器、基于时间的值、静态值或基于用户属性(用户名或用户 ID)的值不足造成的。这意味着攻击者在短时间内监视应用程序并收集其创建的会话令牌后,将能够猜测有效的会话令牌。如果攻击者确定另一个用户的有效会话令牌,则可以查看、修改或删除任意用户的数据,而无需猜测受害者的用户名或密码。因此,推断有效会话令牌的能力使攻击者能够绕过登录页面并避免暴力破解帐户的需要。此外,即使受害者当前未登录应用程序,静态令牌也可以使攻击者能够瞄准用户。这增加了攻击者可以瞄准的受害者群体。

会话令牌应使用强大的随机数生成器创建并从大量数字中收集。例如,如果操作系统的 rand() 函数可以生成统计上均匀分布的 32 位值,那么它通常就足够了。较差的会话令牌是增量的、依赖于用户的帐户 ID、仅使用时间戳或具有其他高度确定性的信息。保护会话令牌安全的其他方法包括始终通过 SSL 传输它们、在一段时间后自动使令牌过期以及在用户注销应用程序时显式使令牌过期。

建议:如果会话值表现出很强的随机性,但是从一小部分值中选择的,那么攻击者就有更好的机会简单地猜测有效令牌。可以通过实施几种补充技术来改进 Web 应用程序的会话管理:

  • 确保 Token 值的大小至少为 32 位,特别是对于并发用户数量较多且每日页面请求量较大的应用程序。
  • 熵源(随机值)的位大小比实际会话令牌的位大小更重要。例如,MD5 哈希会生成 128 位值。然而,增量值、时间戳或 8 位随机数的 MD5 散列都是不安全的,因为可以轻松预测随机值的来源。因此,128 位大小并不代表会话令牌的准确度量。熵源的最小大小为 32 位,但对于每小时超过 10,000 个并发用户的站点可能需要更大的池(48 或 64 位)。
  • 在大多数情况下,应用程序生成的令牌(例如 ASP.NET_SessionId、ASPSESSIONID、JSPSESSIONID、PHPSESSIONID)提供足够大的随机值以防止会话预测攻击。应用程序应该使用这些会话管理算法,除非自定义会话机制已经过彻底的审查和测试。
  • 使用服务器端对象跟踪与会话令牌关联的用户属性,以防止用户模拟攻击。如果应用程序没有严格地将用户的会话令牌与该用户的配置文件信息相关联,则攻击者可能能够通过操纵客户端值来查看任意信息。例如,如果应用程序设置了强会话令牌,但基于“UserId”cookie 执行 SQL 查询,则攻击者只需修改“UserId”cookie 即可冒充其他人。如果应用程序将“UserId”值与服务器端会话对象相关联,那么应用程序将更加安全,因为攻击者将无法修改该值。
  • 当用户注销应用程序或在预定的不活动时间后,会话令牌将过期。我们建议对会话令牌使用 20 分钟的超时,尽管这很大程度上取决于应用程序的类型和预期的使用情况。

我记得,ASP.NET 会话 ID 生成器针对会话预测提供了良好的保护。会话 ID 有 24 个字符,使用 [a-z] 字符和 [0-5] 数字(总共 32 个可能的字符,即 2^5),总共有 2^(5*24) = 2^120 个可能的值。但是,您可以实现 SessionIDManager 来附加一些信息(例如用户主机地址、用户代理、使用 HMAC 算法的验证令牌)以获得更好的保护 - 这样来自不同 IP 地址或不同浏览器的会话 ID 就不会通过验证。如果您实施了表单身份验证,则没有必要这样做,因为身份验证票证已经提供了此类保护。

如果您想要更好的随机会话 ID,您可以在 SessionIDManager 中使用 RandomNumberGenerator(例如 RNGCryptoServiceProvider)并填充一堆字节(例如 32,即 256 位),然后使用 Base64 对它们进行编码

byte[] random = new byte[100];
//RNGCryptoServiceProvider is an implementation of a random number generator.
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random); // The array is now filled with cryptographically strong random bytes.
return Convert.ToBase64String(random) 

然而,本文 http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionidmanager.sessionidmaxlength.aspx表示会话 ID 的最大长度为 80,因此您还必须重写 Validate 方法才能使其正常工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

会话 ID 不够随机 - ASP.NET 的相关文章

随机推荐

  • 处理 UIPageControl 有太多点而无法全部显示在屏幕上的最佳方法是什么

    我的应用程序中有一个 UIPageControl 大约有 10 个页面 点 看起来非常完美 但是用户可以添加许多不同的视图 因此点的数量可能会变成 30 个 发生这种情况时 点就会从屏幕边缘消失 并且您始终无法看到当前选定的页面 这一切看起
  • Python请求响应以utf-8编码但无法解码

    我正在尝试使用 python 抓取我的messenger com facebook Messenger 聊天记录 并且我使用谷歌浏览器开发工具来查看聊天历史记录的 POST 请求 并且我已将整个标头和正文复制为请求可以使用的格式 我得到 H
  • Java:无法从未命名的模块读取包?

    在将项目转移到 Gradle 时 我停止使用 org json 的自定义构建 该构建安装了 module info java 以符合模块系统 现在 我通常通过 Maven 使用它 并且由于 org json 默认情况下不是一个模块 因此它被
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 如何在 C 应用程序中将鼠标光标设置在 X11 上

    我有一个相当大且相当旧的 C 应用程序 已移植到 Linux 上 我负责让鼠标光标正常工作 但遇到一些问题 我能够将我们需要的大部分光标转换为使用提供的标准光标X字体光标 http tronche com gui x xlib append
  • 可以在 .h 文件中声明静态全局变量吗?

    static 关键字将全局变量的范围限制为该翻译单元 如果我使用static int x在 h 文件中并包含该 h 文件每隔一个文件 它们不会都属于同一个翻译单元吗 那么 x不是到处可见吗 那么现在static有什么作用呢 另外 有没有什么
  • python RuntimeError:字典在迭代期间更改了大小

    我有这样的 obj hello world foo 0 bar v1 foo 0 name v2 foo 1 bar v3 它应该扩展到 hello world foo bar v1 name v2 bar v3 我在下面写了代码 按 删除
  • 测试 AngularJS 指令的焦点

    如何测试 AngularJS 指令中的焦点 我希望以下内容能够发挥作用 describe focus test function it should focus element function var element
  • 创建自定义 json 转换器来屏蔽敏感信息

    我正在编写一个自定义 json 转换器 它将序列化一个对象并屏蔽包含一些敏感信息的某些字段 我已经创建了转换器 但是当我使用转换器序列化对象时 我得到一个空字符串 有人可以告诉我我做错了什么吗 public class Student pu
  • 如何在python中查找csv文档中的特定行

    我想要做的是读入 csv 文档并找到 SN 列 gt 20 中的所有值 然后创建一个仅包含 SN gt 20 行的新文件 我知道我需要做 阅读原始文件 打开一个新文件 迭代原始文件的行 我能够做的是找到 SN gt 20 的行 import
  • 使用 SingleChildScrollView 时无法向下拖动底部工作表

    我创建了一个带有bottomsheet 和listview builder 的应用程序 在底部 有一个文本按钮 当我将其向上拖动时 底部工作表必须出现 底页上有一张表格 我用 SingleChildScrollView 包裹底部纸张 但是当
  • 如何在屏幕上动态移动 Textview? (框架布局)

    我有一个应用程序 可以在屏幕上的 FrameLayout 上显示相机视图 屏幕处于固定风景模式 我需要编写一个带有动态确定的屏幕坐标的textView 坐标以百分比确定 例如 将文本视图写入屏幕坐标 x 80 y 20 屏幕上 将文本视图写
  • 如何使用C来限制SubString、Limit? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 第1节 include
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 重新排序 numpy ndarray 的最后一个维度

    我有一个未指定维度的数组 可能是 1D 2D 3D 4D 我想使用与最后一个维度大小相同的索引数组来申请对最后一个维度进行重新排序 我知道如何使用虚拟 if if 语句来做到这一点 import numpy as np a np ones
  • PutAsync 不会向 Web api 发送请求,但 fiddler 工作正常

    几个小时以来我一直在试图找出问题所在 但我就是找不到问题所在 通过 Mvc 应用程序 put 方法不会被命中 请求不会发生 但是当我在 fiddler 中测试它时 api 中的 PutMethod 可以工作 希望有人能为我解决问题 也欢迎提
  • WebStorm已将目录中的所有文件标记为非项目文件

    WebStorm 已将我的项目子目录 根目录的服务器部分 中的所有文件标记为非项目文件 它发生在我转换到 Babel 然后又转换到 TypeScript 的过程中 我已经删除了 TypeScript 的内容 想知道这是否与该配置有关 我相信
  • R中的Score Sentiment函数,始终返回0

    我对分数有一个 可能 愚蠢的问题 情绪 我尝试将此函数与 3 个默认短语一起使用 问题是该函数返回分数 0 0 0 但它应该返回 2 5 4 我不明白这个问题 因为 RGui 不会给我错误 而且我正在遵循教程 我已经下载了否定词和肯定词的列
  • 如何在play 2.0模板中格式化数字/日期?

    我在使用 play 2 0 模板系统时遇到了一些困难 我有一个方法返回 scala 中的 Int 我想使用模式 对其进行格式化 我努力了 order itemCount format and order item count format
  • 会话 ID 不够随机 - ASP.NET

    UPDATE 我们最终与 Acunetix 团队的一些程序员进行了会面 他们意识到他们的代码中可能存在一些错误 导致扫描中显示的问题比实际情况更严重 普遍的共识是忽略扫描结果并使用开箱即用的 ASP NET 会话 ID 生成 因为它对于我们