在.NET 1.x中,您可以在程序集上使用StrongNameIdentityPermissionAttribute,以确保只有您签名的代码才能访问程序集.根据MSDN文档,
在.NET Framework 2.0及更高版本中,如果调用程序集具有完全信任,则对身份权限的要求无效.
这意味着任何具有完全信任的应用程序都可以绕过我的安全需求.
如何防止未经授权的代码访问.NET 2.0中的程序集?
在ASP.NET应用程序中应用程序池回收后不久,我们间歇性地看到以下异常:
System.Configuration.ConfigurationErrorsException: Could not load file or assembly 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418) ---> System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. Failed to grant permission to execute. (Exception from HRESULT: 0x80131418)
File name: 'Microsoft.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Security.Policy.PolicyException: Execution permission cannot be acquired.
at System.Security.SecurityManager.ResolvePolicy(Evidence evidence, PermissionSet reqdPset, PermissionSet optPset, PermissionSet denyPset, PermissionSet& denied, Boolean checkExecutionPermission) …Run Code Online (Sandbox Code Playgroud) 我刚刚阅读了有关代码访问安全性的这篇文章.它有这样一个例子:
using System.Security.Permissions;
public class MyFileAccessor
{
public MyFileAccessor(String path, bool readOnly)
{
path = MakeFullPath(path); // helper fcn
FileIOPermissionAccess desiredAccess = readOnly
? FileIOPermissionAccess.Read
: FileIOPermissionAccess.AllAccess;
FileIOPermission p = new FileIOPermission(desiredAccess, path);
p.Demand();
//
•••
open the file
}
// •••
}
Run Code Online (Sandbox Code Playgroud)
如果我没有使用FileIOPermissionAccess类型并且在我的代码中从不包含像p.Demand()这样的代码怎么办?换句话说,如果我想做坏事,我为什么要费心去做那个? 这不是一个笑话吗?或者我错了吗?
我使用的是VSTS 2008 + .Net 2.0 + C#.我在构建后运行代码分析.我收到了以下令人困惑的安全警告.这是警告和相关代码,任何想法有什么不对?如果有安全警告,如何解决?
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName = "IExplore.exe";
myProcess.StartInfo.Arguments = @"default.html";
myProcess.StartInfo.Verb = "runas";
myProcess.Start();
Run Code Online (Sandbox Code Playgroud)
警告:CA2122:Microsoft.Security:'TestHtml()'调用具有LinkDemand的'Process.Start()'.通过进行此调用,'Process.Start()'间接暴露给用户代码.查看以下可能提供绕过安全保护的方法的调用堆栈:
如果我将以下行添加到ASP.NET MVC操作方法
throw new Exception("outer", new SecurityException("inner"));
Run Code Online (Sandbox Code Playgroud)
实际显示在死亡黄色屏幕上的错误是内部SecurityException,绝对没有提到外部异常.
抛出:SecurityException
说明:应用程序尝试执行安全策略不允许的操作.要授予此应用程序所需的权限,请与您的系统管理员联系或在配置文件中更改应用程序的信任级别.
异常详细信息:System.Security.SecurityException:inner
来源错误:
在执行当前Web请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息.
堆栈跟踪:
[SecurityException:inner]
这是预期的行为吗?
外部异常的类型似乎并不重要.即使它是另一个SecurityException,也不会显示该消息.默认的SecurityException错误消息是如此模糊,我想捕获它并添加一些更具体的信息.如果我不包含原始的SecurityException作为innerException,但是理想情况下我想这样做,这样可以正常工作.
我正在研究代码访问安全性.我需要付出一些努力来解决问题,所以我认为我最终会使用Reflector并开始研究.NET 4.0如何使用安全属性.
该System.IO.File.Delete方法使用[SecuritySafeCritical]属性进行修饰.
该System.IO.File.Delete方法委托给使用该属性修饰的内部方法InternalDelete[SecurityCritical].
我在我的一个名为DeleteFile的 MVC应用程序类中有一个方法正在运行SecurityTransparent(我已经通过检查DeleteFile的MethodInfo.IsSecurityCritical属性进行了验证)
根据我目前的理解,这意味着:
[SecuritySafeCritical]方法可以调用,[SecurityCritical]因此不会抛出SecurityException.[SecurityTransparent]可以调用[SecuritySafeCritical]所以基本上,在不调整任何开箱即用的安全设置的情况下,此代码将成功删除名为test.txt的虚拟文件
namespace MyTestMvcApp
{
public class FileHelpers()
{
// Has SecurityTransparent
public void DeleteFile()
{
// Will succesfully delete the file
File.Delete("test.txt");
}
}
}
Run Code Online (Sandbox Code Playgroud)
在InternalDelete方法中System.IO.File.Delete,它使用该CodeAccessPermission.Demand方法检查堆栈中的所有调用者是否具有必要的权限.我不太明白的是MSDN文档中的这一行CodeAccessPermission.Demand:
不检查调用此方法的代码的权限; 检查从该代码的直接调用者开始并继续向上移动.
所以我的问题是,如果我的应用程序的DeleteFile方法是SecurityTransparent,如何允许调用SecurityCritical方法?
这可能是一个破旧的例子,或许有一些缺失的概念,但正如我所说,我仍然在理解它,任何洞察力的人都可以给予更多我将发展我的理解. …
我正在构建一个Web工具来检查提交的内容是从Web获取还是提交者自己的工作.抄袭探测器.
我有一些想法,我可以生成校验和,并将其用作与其他条目进行比较的关键.但是,如果有人做了一些小的更改,比如包括/删除注释,更改变量/函数名等等,那么校验和将会有所不同,所以这种方法不起作用.
有什么更好的方法吗?
我有一个标有AllowPartiallyTrustedCallersAttribute包含自定义异常类的程序集.我想通过覆盖使其可序列化GetObjectData.
使用.NET 4,GetObjectData已经成为一种SecurityCritical方法.这意味着还需要覆盖SecurityCritical.由于我的程序集标有AllowPartiallyTrustedCallersAttribute,所以SecurityTransparent除非另有说明,否则所有代码都是自动的.因此,我将应用于SecurityCriticalAttributeGetObjectData覆盖:
using System;
using System.Runtime.Serialization;
using System.Security;
[assembly:AllowPartiallyTrustedCallers]
namespace Library
{
[Serializable]
public class MyException : Exception
{
public string String;
public MyException ()
{
}
protected MyException (SerializationInfo info, StreamingContext context)
: base(info, context)
{
String = info.GetString ("String");
}
[SecurityCritical]
public override void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
{
info.AddValue ("String", String);
base.GetObjectData (info, context);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这在完全信任的情况下工作正常,例如,当我运行从桌面链接此程序集的代码时.
但是,当我从安全沙箱中使用这个类时(见下文),我得到了一个 …
我有一个解决方案,我正在尝试从.NET 2转换为.NET 4.此解决方案中有多个项目,其中一些在C#中,其中一些在VB中.他们中的大多数使用system.xml进行XML创建和解析.
我已经将所有项目重新定位到.NET 4,并进行编译.但是,当我尝试运行时,我几乎立即得到一个System.FieldAccessException,说"如果类库中字段的访问级别已更改,请重新编译引用该库的任何程序集.".在此之前我确实重新编译了整个解决方案(之后再次尝试,没有变化).
然后,我使用程序集绑定日志查看器查看是否有任何绑定失败,因为这是在项目中引用了不同的dll时发生的.果然,那里有失败.他们在两个不同的VB项目中,他们看起来像这样:
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable <path to my exe>
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = <projname>.XmlSerializers, Version=2013.20.0.0, Culture=neutral, PublicKeyToken=null, processorArchitecture=MSIL (Fully-specified)
LOG: Appbase = <projectpath>
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = <projname>.vshost.exe Calling assembly : System.Xml, …Run Code Online (Sandbox Code Playgroud) 我为正确“设置”我无法验证的方法以使其符合代码访问安全性准则而需要做的事情感到困惑。
给出以下方法
[MethodImpl(MethodImplOptions.ForwardRef)]
private extern void DoStuffUnverifiable();
Run Code Online (Sandbox Code Playgroud)
哪些是无法验证的PEVerify,我绝对需要将哪些属性应用于方法定义?
[SecurityCritical]? [SecuritySafeCritical]?我该如何在这两者之间做出决定?进一步,
[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)]吗?SecurityAction.Demand还是其他?我肯定还需要应用其他属性吗?我有什么可以申请的,尽管不是必需的?