【问题标题】:Should Code Contracts be used for security?代码合同是否应该用于安全性?
【发布时间】:2011-01-13 23:21:51
【问题描述】:

您有什么理由不使用代码合同来执行业务规则?

假设您有一个User 类,它代表系统的单个用户并定义可以针对其他用户执行的操作。您可以像这样编写ChangePassword 方法...

public void ChangePassword(User requestingUser, string newPassword)
{
    Contract.Requires<ArgumentNullException>(requestingUser);
    Contract.Requires<ArgumentNullException>(newPassword);

    // Users can always change their own password, but they must be an
    // administrator to change someone else's.
    if (requestingUser.UserId != this.UserId &&
        !requestingUser.IsInRole("Administrator"))
        throw new SecurityException("You don't have permission to do that.");

    // Change the password.
    ...
}

或者您可以使用Contract.Requires...作为前提条件实施安全检查...

public void ChangePassword(User requestingUser, string newPassword)
{
    Contract.Requires<ArgumentNullException>(requestingUser != null);
    Contract.Requires<ArgumentNullException>(newPassword != null);

    // Users can always change their own password, but they must be an
    // administrator to change someone else's.
    Contract.Requires<SecurityException>(
        requestingUser.UserId == this.UserId ||
        !requestingUser.IsInRole("Administrator"),
        "You don't have permission to do that.");

    // Change the password.
    ...
}

这两种方法的优缺点是什么?

【问题讨论】:

    标签: security .net-4.0 code-contracts


    【解决方案1】:

    我认为答案是否定的。 代码契约专为失败表明代码中存在严重错误的场景而设计。它们应该是可以从错误的用户输入中恢复的东西。

    Requires&lt;T&gt; 仅用于库的公共方法,这些方法将由不使用代码协定的其他人使用,或者如果您有遗留代码需要在它可以抛出的异常方面保持兼容.

    对于新代码,您应该只使用Requires,而不是Requires&lt;T&gt;。 Plain Requires 默认抛出无法捕获的异常,强制你处理问题。

    此外,如果有人禁用 Code Contracts 运行时检查,您的所有安全性都会消失!

    【讨论】:

    • 人们也可以提出这样的论点:在某些情况下,您给出的示例代码中的一个严重错误。例如,如果您正在编写的方法被隐藏了好几层,并且所有验证都意味着发生在应用程序的外部层,那么这可以被认为是方法契约的一部分。这一切都取决于:)
    • 好答案!我还没有意识到ContractException 的不可捉摸的性质,但您的回答为我指明了正确的方向:infoq.com/articles/code-contracts-csharp - 谢谢! :)
    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多