如何在安全上下文中使用不安全代码?

Posted

技术标签:

【中文标题】如何在安全上下文中使用不安全代码?【英文标题】:How to use unsafe code in safe contex? 【发布时间】:2014-11-15 05:27:12 【问题描述】:

我需要将SecureString 用于微软的课程,我在internet 上找到了以下代码:

public static class SecureStringExt

    public static SecureString ConvertToSecureString(this string password)
    
        if (password == null)
            throw new ArgumentNullException("password");

        unsafe //Red highlighted line
        
            fixed (char* passwordChars = password)
            
                var securePassword = new SecureString(passwordChars, password.Length);
                securePassword.MakeReadOnly();
                return securePassword;
            
        
    

唯一的问题是unsafe 关键字不断向我抛出错误说Cannot use unsafe construct in safe context。 不幸的是,我找不到为什么会这样……

注意: 上面的代码在 LINQPad 中运行,但在 VS2013 中没有(使用 resharper)。

【问题讨论】:

我不明白为什么你需要在这里使用 unsafe,你创建了没有不安全代码的安全字符串。检查我的答案。 文档说你不应该使用那个构造函数。见msdn.microsoft.com/en-us/library/176bafkd(v=vs.110).aspx 使用@mybirthname 在他的回答中给出的代码 【参考方案1】:

我不确定在这种情况下您是否需要不安全的代码(请参阅 @mybirthname 的回答)。

但当需要不安全的代码时,可以在项目属性中启用。

在主菜单中,单击Project,然后单击<ProjectName> properties... 点击Build页面。 选择Allow unsafe code

或者可以明确指定/unsafe 编译器选项。

【讨论】:

可以声明吗? @jww 什么意思? 通过使用属性。像Declarative Security 这样的东西。根据需要关闭它似乎更好,而不是到处关闭它。 @jww 我完全同意应该尽量减少启用不安全编译。但是我怀疑属性对unsafe ... 有帮助。编译器给出error CS0227: Unsafe code may only appear if compiling with /unsafe。如果你知道怎么做,请告诉我。 这就是我要问的:)【参考方案2】:
    public static SecureString GetSecureString(string password)
    
        SecureString secureString = new SecureString();

        foreach (char c in password)
        
            secureString.AppendChar(c);
        

        secureString.MakeReadOnly();
        return secureString;
    

你可以在没有不安全代码的情况下做同样的事情。

【讨论】:

以上是关于如何在安全上下文中使用不安全代码?的主要内容,如果未能解决你的问题,请参考以下文章

在jetbrains骑手中允许不安全的代码?

如何在 Spring MVC 中模拟安全上下文以进行测试

unsafe,fixed与GCHandle

如何在 react-native-webview 中启用安全上下文?

如何在 Intranet 中处理需要安全上下文的 Web 应用程序?

如何在多个微服务中管理安全上下文