4

最近、「poof-all-customer-data-is-gone」の問題をデバッグしていました。Directory.Delete(customerRoot, true)間違った分岐がコード行につながることを理解するのに、それほど時間はかかりませんでした。壊滅的な行は、通常の GUI 開発者によって作成されました。このような災害につながる可能性のある回線は多くありません。だから私の質問は、この特定の呼び出しを防ぐ方法です。(DirectoryInfo.Delete()2番目のものです)。

これが可能な解決策の優先順位のリストです

  • サード パーティがビルド プロセスを変更していない場合のコンパイル エラー
  • 第三者のいないランタイム傍受
  • サードパーティによるランタイム インターセプト (ビルド プロセスの変更なし)
  • サードパーティによるコンパイル エラー (PostSharp が行うと思います)
  • 顧客がデータをどのように愛しているかについての GUI 開発者向けの教育セミナー

他のアイデアはありますか?

私たちのシステムには、ファイル/フォルダーの削除専用のサービス (検証およびログ記録) があることに言及します。

4

3 に答える 3

1

完全な信頼の下で実行されないようにアプリケーションを変更できます。物理ディスクへのアクセスを制限する信頼レベルを構成します。FileIOPermissionを見てください。これは特定の場所に設定できるため、かなりの制御が可能であることに注意してください。

需要の概要

更新 これについてもう少し考えた後、私は「乳母テスト」も提案します。何らかのテストを実行している場合は、アセンブリ内のすべてのタイプを調べ、FileSystemメソッドのいずれかへの呼び出しをチェックするテストを追加できます。このような呼び出しはすべてホワイトリストに登録する必要があります。そうしないと、テストが失敗します。私が取り組んでいるプロジェクトはこれを使用しており、多くの価値を提供します。

更新2 このタイプの乳母テストを行う方法についてのコメントがありました。基本的に、リフレクションを使用してすべてのメソッドを取得してから、ILで禁止されている呼び出しを探す必要があります。それはそれよりも複雑に聞こえます。

アセンブリから特定のIL(.NET中間言語)署名を抽出するメカニズム

更新 3ILを直接いじることを伴わない、このタイプの乳母テストを行うための別のより良い方法があります。これを行う方法についてブログに記事を投稿しました。

http://datatoknowledge.com/2012/09/10/nanny-tests/

エリック

于 2012-06-30T23:32:19.393 に答える
1

実行時に呼び出しを「傍受」するには、FileSystemWatcherクラスを使用できますが、実際には削除を防ぐことはできず、削除が行われたことを知らせるだけです。実際の削除を防止することは、はるかにトリッキーです。Windows は Linux の ptrace 機能を提供しないため、システム コール自体をインターセプトすることはできません (これに関する記事はここにありますが、私が知る限り、使いやすさはかなり制限されています)。他の人が提案すること-アクセス権と信頼レベルの設定-は機能するかもしれませんが、実際に何かを削除する必要があり、「削除サービス」が.NETメソッドの単なるラッパーである場合、それも機能しなくなります。

もう1つのオプションは、サードパーティのツールを使用してコンパイル時にこれを確認することです-この質問には、例を含め、そのために必要なものだけが含まれており、これを実行できるツールが他にもたくさんあります(私はResharperのみを使用していますが、私は想像しますタスクを達成することもできます)。

しかし、私はそれがここでのポイントだとは思わない. あなたの開発者はミスを犯し、一部の顧客データを破壊しましたが、誰もそれについて満足していません。システム全体のルールを作成してそのルールを適用する必要があるという意味ではありません。開発者が自分のコードをよりよくテストする必要があり、および/またはあなたが言及した削除サービスを使用する必要があることを意味します(それが何であれ)。どんなに頑張っても、人々が愚かなことをするのを防ぐことはできません. Directory.Delete() メソッドを強化するのに時間とお金を費やしたくはありませんが、他の誰かが別のばかげた間違いを犯したことがわかり、この特定のことが二度と問題になることはありません。このような問題 ( Directory.Delete() の誤用) がシステムで通常よりも頻繁に発生する傾向がある場合を除き、手放して、他のことに集中してください。

于 2012-07-01T09:37:14.350 に答える
0

グローバルに含まれる名前空間内に別のディレクトリ クラス (および DirectoryInfo) を含めることができます。メッセージとともに例外をスローする同一のダミー関数を含めます。

于 2012-06-30T22:57:57.690 に答える