CA5368:针对派生自 Page 的类设置 ViewStateUserKey

属性
规则 ID CA5368
标题 针对派生自 Page 的类设置 ViewStateUserKey
类别 安全性
修复是中断修复还是非中断修复 非中断
在 .NET 8 中默认启用

原因

未在 Page.OnInitPage_Init 方法中分配 Page.ViewStateUserKey 属性。

规则说明

设计 ASP.NET Web 窗体时,请注意防范跨网站请求伪造 (CSRF) 攻击。 CSRF 攻击可将来自经过身份验证的用户的恶意请求发送到 ASP.NET Web 窗体。

在 ASP.NET Web 窗体中防御 CSRF 攻击的一种方法是将页面的 ViewStateUserKey 设置为不可预测且对会话唯一的字符串。 有关详细信息,请参阅利用 ASP.NET 内置功能来防范 Web 攻击

如何解决冲突

将每个会话的 ViewStateUserKey 属性设置为不可预测的唯一字符串。 例如,如果使用 ASP.NET 会话状态,则 HttpSessionState.SessionID 将起作用。

何时禁止显示警告

在以下情况下,禁止显示此规则的警告是安全的:

  • ASP.NET Web 窗体页不执行敏感操作。
  • 跨网站请求伪造攻击以此规则无法检测的方式得以减轻。 例如,如果页面继承自包含 CSRF 防御的母版页。

抑制警告

如果只想抑制单个冲突,请将预处理器指令添加到源文件以禁用该规则,然后重新启用该规则。

#pragma warning disable CA5368
// The code that's violating the rule is on this line.
#pragma warning restore CA5368

若要对文件、文件夹或项目禁用该规则,请在配置文件中将其严重性设置为 none

[*.{cs,vb}]
dotnet_diagnostic.CA5368.severity = none

有关详细信息,请参阅如何禁止显示代码分析警告

伪代码示例

冲突

using System;
using System.Web.UI;

class ExampleClass : Page
{
    protected override void OnInit (EventArgs e)
    {
    }
}

解决方案

using System;
using System.Web.UI;

class ExampleClass : Page
{
    protected override void OnInit (EventArgs e)
    {
        // Assuming that your page makes use of ASP.NET session state and the SessionID is stable.
        ViewStateUserKey = Session.SessionID;
    }
}