C# 枚举 - C# 枚举 枚举 - C Sharp 枚举 - 标志枚举

C#枚举的误用:简单的标志如何引发严重的安全问题

当一个简单的 C# 枚举变成安全风险

AC # 枚举通常看起来无害,但如果值重叠或缺少验证,则很容易造成权限缺陷。
许多开发者依赖 C# 枚举或标志枚举来进行权限控制,但如果不强制执行唯一且经过验证的值,逻辑就会悄无声息地出错。此示例不安全,仅供学习参考。

⚠️不安全的示例,仅用于教育目的。请勿在生产环境中使用。

public enum UserRole
{
    None = 0,
    User = 1,
    Admin = 2,
    SuperAdmin = 3 // ❌ Overlaps with Admin
}

安全版本:

public enum UserRole
{
    None = 0,
    User = 1,
    Admin = 2,
    SuperAdmin = 4
}
// # Educational note: Always assign unique power-of-two values for flag enums.

教育说明: 即使像这样简单的 C# 枚举,如果未经检查的值通过了验证层,也可能暴露关键端点。

标志枚举和 C# 枚举逻辑中的常见漏洞

大多数安全问题都源于标志枚举或 C# 枚举数据的不安全转换。

无效类型转换

⚠️此示例不安全,仅供教育用途:

var role = (UserRole)Enum.Parse(typeof(UserRole), input);

攻击者可以发送未定义的整数来触发意想不到的逻辑路径。

安全版本:

if (!Enum.TryParse(input, out UserRole role) || !Enum.IsDefined(typeof(UserRole), role))
    throw new InvalidOperationException("Invalid role value");

教育提示:始终验证 C# 枚举和标志枚举的解析值。

标记 C# 枚举错误

⚠️此示例不安全,仅供教育用途:

[Flags]
public enum Permissions
{
    None = 0,
    Read = 1,
    Write = 2,
    Admin = 3 // ❌ Overlaps with Read + Write
}

安全版本:

[Flags]
public enum Permissions
{
    None = 0,
    Read = 1,
    Write = 2,
    Delete = 4,
    Admin = 8
}

教学提示:使用不同的 2 的幂来定义标志枚举。

错误定义的标志枚举是导致 C# 枚举逻辑中权限提升的最简单方法之一。

C#枚举处理中的序列化陷阱

C#枚举值的宽松序列化可能会使您的应用程序面临状态不一致的问题。 反序列化攻击。

⚠️此示例不安全,仅供教育用途:

var data = JsonSerializer.Deserialize<User>(payload);

If payload contains "Role": 99, it maps to an invalid c# enum enum value.

安全版本:

var opts = new JsonSerializerOptions
{
    Converters = { new JsonStringEnumConverter(JsonNamingPolicy.CamelCase, allowIntegerValues: false) }
};
var data = JsonSerializer.Deserialize<User>(payload, opts);


教育说明: 绝不允许从不受信任的输入中反序列化数值枚举。

防止 DevSecOps 中出现 C# 枚举逻辑错误 Pipelines

DevSecOps团队应实现验证自动化 对于每个 C# 枚举、C sharp 枚举和标志枚举定义,以防止状态不一致。

例如,安全 pipeline 积分:

- name: Validate enum definitions
  run: |
    dotnet test --filter Category=EnumValidation
    xygeni validate --rules enums
# Never expose real tokens or internal URLs in pipelines

教育提示:静态分析可以在部署之前检测出重叠的标志枚举、不安全的反序列化和缺失的 switch case。

使用 Xygeni 检测枚举和标志问题

西吉尼 Code Security 自动检测 C# 授权逻辑中重叠或不一致的标志枚举值、不安全的枚举解析以及缺失的验证。

Xygeni 检测:

  • 重叠或错位的标志枚举值
  • 不安全的 C# 枚举解析逻辑
  • C# 枚举使用中的反序列化缺陷
  • 授权逻辑中缺少验证或默认情况

计费示例:

xygeni scan --detect enums

教育说明: 使用 Xygeni 来强制执行枚举完整性并保护标志枚举。

Xygeni 会验证枚举定义,检测重叠或不一致的值,并自动强制执行。 CI/CD pipelines 通过:

xygeni validate --rules enums

强大的逻辑需要强大的类型声明和验证机制。

是否使用 standard 在 C# 枚举或复杂标志枚举中,每个值都必须明确指定、经过验证和测试。未经检查的整数或重叠的标志可能导致权限提升、不安全的状态变更和逻辑不一致。 借助 Xygeni,团队可以自动检测和验证枚举定义,从而确保从开发到部署的强类型、可预测的逻辑和安全行为。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件