2014-09-20 13 views
22

muszę korzystać SecureString dla klasy Microsoft i znalazłem następujący kod na internet:Jak używać niebezpiecznego kodu w bezpiecznym konteksie?

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; 
      } 
     } 
    } 
} 

Jedynym problemem jest to, że słowo kluczowe unsafe utrzymuje rzucanie mi błąd mówiąc Cannot use unsafe construct in safe context. Niestety nie mogłem znaleźć, dlaczego tak się dzieje ...

Uwaga: Powyższy kod działa w LINQPad ale nie w VS2013 (z Resharper).

+5

Nie rozumiem, dlaczego musisz używać tutaj niebezpiecznych, możesz utworzyć bezpieczny ciąg bez niebezpiecznego kodu. Sprawdź moją odpowiedź. – mybirthname

+2

Dokumentacja mówi, że nie powinieneś używać tego konstruktora. Zobacz: http://msdn.microsoft.com/en-us/library/176bafkd(v=vs.110).aspx Użyj kodu @mojrodzeniename podanego w jego odpowiedzi – MicroVirus

Odpowiedz

45

Nie jestem pewien, czy w tym przypadku potrzebujesz niebezpiecznego kodu (patrz odpowiedź: @mybirthname).

Ale gdy niebezpieczny kod jest potrzebny, można go włączyć we właściwościach projektu.

  • W menu głównym, a następnie kliknij Project<ProjectName> properties...
  • Kliknij na stronie Build.
  • Wybierz Allow unsafe code.

Allow unsafe code

Albo można określić /unsafe kompilatora opcji jawny.

+0

Czy można to zgłosić? – jww

+0

@jww Co masz na myśli? – AlexD

+0

Korzystanie z atrybutów. Coś w stylu [Deklaratywne bezpieczeństwo] (http://msdn.microsoft.com/en-us/library/kaacwy28%28v=vs.110%29.aspx). Wydaje się, że lepiej wyłączyć go w razie potrzeby, niż wyłączyć wszędzie. – jww

9
public static SecureString GetSecureString(string password) 
    { 
     SecureString secureString = new SecureString(); 

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

     secureString.MakeReadOnly(); 
     return secureString; 
    } 

Można zrobić to samo bez niebezpiecznego kodu.

+0

W tym przykładzie marnujesz pętlę. Ten fragment jest wolniejszy. – CodeArtist

+0

Dobra, dziękuję za twoją opinię :) – mybirthname

+1

Zauważ przykład dla konstruktora [MSDN] (https://msdn.microsoft.com/en-us/library/7y8s44by (v = vs.110) .aspx) używa bardzo podobny kod z pętlą ... –

Powiązane problemy