4

これは私の文字列の内容を上書きしますか:

unsafe
{
    fixed (char* chars = str)
    {
        for (int i = 0; i < str.Length; i++)
            chars[i] = '1';
    }
}

バックグラウンドは、私はNetworkCredientialsを使用していることです。ここでは、普通の古い を使用してパスワードを設定しますSystem.String。可能であれば、後で「クリア」したいと思います。これを行う方法に関する提案は大歓迎ですが、主な質問はfixed、基になる char 配列に本当にアクセスできるかどうかを理解することです。ありがとう!

編集

ここで何が起こっているのかを理解したいのですが、文字列オブジェクトが不変で、fixedオブジェクトを動かせない場合、投稿されたコードで何が起こっているのでしょうか? それらの文字はどこに書かれていますか?

4

3 に答える 3

12

代わりに、NetworkCredentialsコンストラクターのオーバーロードを使用してください。SecureStringそのオーバーロードの全体的な理由は、この問題を回避することです。System.Stringインスタンスを変異させようとしてはいけません。(リフレクションでは確かに可能ですが、避けるべきです。)

于 2013-11-06T10:29:12.553 に答える
6

System.String不変なので、変更することはできません。

MSDN から:

文字列は不変です。オブジェクトの作成後に文字列オブジェクトの内容を変更することはできませんが、構文上は変更できるかのように見えます。

セキュリティ上の理由で文字列を消去する必要がある場合は、SecureStringを調べてみてください。

実際、あなたのコードは文字列を変更します。ここで Eric Lippert からの回答を見ることができます: String immutability in C# :

CLR によって不変性が適用される型を作成できます。その後、"unsafe" を使用して、CLR 強制メカニズムをオフにすることができます。安全システムがオフになるため、「安全でない」が「安全でない」と呼ばれるのはそのためです。安全でないコードでは、不変のバイトと不変を強制する CLR のコードの両方を含め、十分に努力すれば、プロセス内のメモリのすべてのバイトが書き込み可能になる可能性があります。

を使用しないC# のバージョンに本当に制限されている場合はSecureString、安全でないコードを使用する必要があります。しかし、おそらく最善の解決策は、バージョンを変更するために一生懸命努力することです.

于 2013-11-06T10:28:10.070 に答える
2

ここで何が起こっているのかを理解したいと思います-文字列オブジェクトが不変であり、修正されてもオブジェクトを移動できない場合、投稿されたコードで何が起こっていますか? それらの文字はどこに書かれていますか?

ルールに従ってプレイする場合にのみ、文字列は不変です。ここでは、安全でないコードを使用して実際に文字列を変更しています。(通過するという意味では「安全」であるが、他の方法でルールを曲げるコードでも可能です。たとえば、リフレクションを介しpeverifyて非パブリック メソッドを呼び出したり、共用体構造体を悪用したりします。)AppendInPlace

そのようなルールを破ることは危険です。文字列のインターンに干渉する可能性があります。各 .NET オブジェクトの先頭に存在する TypeHandle および syncblk バイトなど、.NET ランタイムが依存するメモリ位置が破損する可能性があります。等。

于 2013-11-06T10:44:38.953 に答える