Code Access Securityその4
今回は解説ではなく、個人的な疑問について。(^^;
[assembly: FileIOPermission (SecurityAction.RequestMinimum, Read=@"c:\home")]
FileIOPermission及びReadはC:\homeに対する読み取り権限を、RequestMinimumはそれが必要条件であることを意味しています。ところで、次のようなコードがあったとします。
using System; using System.IO; using System.Security; using System.Security.Permissions; [assembly: FileIOPermission (SecurityAction.RequestMinimum, Read=@"c:\home")] class Program { static void Main () { string path = null; FileStream fs = null; path = @"c:\home\security.txt"; Console.WriteLine ("Read:" + path); fs = File.OpenRead (path); fs.Close (); path = @"c:\windows\win.ini"; Console.WriteLine ("Read:" + path); fs = File.OpenRead (path); fs.Close (); } }
c:\home\security.txtとc:\windows\win.iniの読み取りを行っていますが、これは勿論、問題なく実行出来てしまいます(RequestMinimumは最低限、この権限を要求するというだけで、c:\全体に対して権限を持っていても制限はしない)。すると、RequestMinimumにはどんな意味があるのでしょうか。わざわざ属性を付けなくても権限がなければFile.OpenReadで失敗するでしょうし。思いつくとすれば、セキュリティチェックをアセンブリのロード時に行うためってくらいでしょうか?
次にRequestOptionalについて。上記サンプルの属性を次のように変えてみます。
[assembly: FileIOPermission (SecurityAction.RequestOptional, Read=@"c:\home")]
今度はwin.iniの読み込みで例外が発生します。RequestOptionalのネーミングからすると、「指定した権限はオプション(無くても良い)」って思いたくなるのですが、実際は違います。要求する権限は確かにオプションなんですが、それ以外の副作用があるんですよね。何故か指定した権限(FileIOPermission)以外を無効にしてしまいます。つまり、c:\homeの読み取りしか出来ず、それ以外のネットワーク関連やレジストリ、印刷・・・などなどの全てが出来なくなります。RequestMinimumとRequestOptionalの関係が美しくない気がしますね。*1
*1:Essential.NETではRequestMinimumも他の権限を打ち消すように書かれている。仕様変更したのか?