1

他のユーザーがサーバーに自由にアップロードできるプラグイン タイプのコンポーネントをロードするこの小さなアプリがあります。しかし、ユーザーが他のユーザーのファイルにアクセスできるようにしたくありません。各プラグイン コンポーネントのアクセスを制限付きアクセスに設定する必要があります。

プラグイン クラスの基本クラス内でアクセスを設定しようとしましたが、ロードされたプラグイン クラスは完全なファイル アクセスを持っているようです。

誰がページをロードするかによってパスが変わるため、属性でパーミッションを設定できません。

コード スニペストを次に示します。

public abstract class PluginBase<T>
{
public PluginBase
{
PermissionSet ps = new PermissionSet(System.Security.Permissions.PermissionState.None);
            ps.AddPermission(new System.Security.Permissions.FileIOPermission(System.Security.Permissions.FileIOPermissionAccess.PathDiscovery | System.Security.Permissions.FileIOPermissionAccess.Read, HttpContext.Current.Server.MapPath("/app_data/www_somesite_com")));
            ps.PermitOnly();
}
}
public class SomePlugin : PluginBase<SomePlugin>
{
public SomePlugin
{
File.WriteAllText("c:\test.txt", "This should not be possible, but it is.. why?");
}
}

よろしくお願いします!

4

1 に答える 1

0

独自の属性を実装できるため、ソリューションは実際には非常に単純です (これにより、デコレータ属性に定数を使用する代わりに、許可されたパスをプログラムで解決できます)。

using System.Security;
using System.Security.Permissions;

public sealed class CustomFileIOPermission : CodeAccessSecurityAttribute
{
    public CustomFileIOPermission(SecurityAction action)
        : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        // You can use your `HttpContext` or similar at this point to resolve the path
        string allowedPath = @"D:\test";

        return new FileIOPermission(FileIOPermissionAccess.Write, allowedPath);
    }
}

上記のクラスは、他の場所での使用を可能にし[CustomFileIOPermission(SecurityAction.PermitOnly)]、効果的にファイルを保護します。

于 2009-08-31T09:19:08.510 に答える