私はコードのスニペットを持っています:
public void MyMethod()
{
DirectoryEntry de;
...
de.AuthenticationType = AuthenticationTypes.Secure;
...
}
そのFxCopは窒息します:
CA2122:リンク要求のあるメソッドを間接的に公開しないでください
解決策:LinkDemandを持つ
MyMethod()
呼び出し。 この呼び出しを行うことにより、は間接的にユーザーコードに公開されます。DirectoryEntry.AuthenticationType.set(AuthenticationTypes)
DirectoryEntry.AuthenticationType.set(AuthenticationTypes)
情報:LinkDemandによって保護されているメソッドを、セキュリティチェックを実行しないメソッドでラップしないでください。LinkDemandは、呼び出しスタック内のすべての呼び出し元のアクセス許可をチェックするのではなく、直接の呼び出し元のアクセス許可をチェックします。この場合、ラッパーメソッドの権限がチェックされます。ラッパーメソッド自体が、コールスタックの上位にある呼び出し元のアクセス許可をチェックしない場合、悪意のあるコードが、アクセス許可がなくても、ラップされた関数を実行できる可能性があります。」
この問題を「修正」するために、どこかに何かを追加することにしました。ただし、現在顧客に対して機能しているコードが自発的に顧客に対して機能しなくなる場合は、追加できません。
注:何を追加するのか、どこに追加するのか(FxCopにはその情報は含まれていません)、行き止まりの場合はコードセキュリティの秘密の世界を深く掘り下げたくありません。
に「セキュリティチェック*」を追加するとMyMethod
、現在動作しているコードが動作しなくなる可能性はありますか?
私は、誰かが許可を持っていない場合、今書かれているように、コードは機能しないと思います。言い換えると:
directoryEntry.AuthenticationType = AuthenticationTypes.Secure
誰かが正しい「許可」を持っていない場合、すでに失敗します。コールスタックの上位に「セキュリティチェック」を追加しても、その事実は変わりません。障害をより早くトリガーするだけです。その場合、セキュリティチェックを追加しても問題ありません。
一方、次の場合:
public void MyMethod() {...}
MyMethod();
現在は動作しますが
[SecurityCheck(...)]
public void MyMethod() {...}
AD.MyMethod()
失敗し始めます、そして私はそれを本当に追加することができません。
特に誰もが使用するライブラリコードでは。
私がこれを自分でテストできない理由は、問題が発生する状況を再現する方法を誰も知らないからです。
これは、ほとんどの人がユーザー名とパスワードを使用してADに接続し、プロパティを読み取ろうとして、ActiveDirectoryに対して資格情報を確認する場合と似ています。ユーザー名/パスワードが正しい場合でも、プロパティの読み取りが許可されない場合があります。その失敗のケースを再現するようにActiveDirectoryを構成することを私以外の誰も知らないことを賭けたいと思います。
私の場合、コードのセキュリティが失敗するように設定する方法を誰も知らないと思います。