对ASP.NET网站执行代码覆盖率测试发生System.Security.VerificationException异常的解决方案

简介:

当你对ASP.NET 4.0网站执行代码覆盖率测试时,可能会遇到下面这个异常:

System.Security.VerificationException: Operation could destabilize the runtime.

一般来说,VerificiationException都是关于代码访问安全(CAS)的问题,.NET在执行托管代码之前,首先会验证这个托管程序的强签名,通过确定其来源来判定该托管程序应该拥有的权限。比如说,如果托管程序是微软公司的签名,我们当然是无比的信任它—除非你不用Windows操作系统。机器管理员也可以依据托管程序的来源来决定该托管程序应该拥有的权限,例如读磁盘文件、操作注册表这些操作都是可以配置的权限。比方说,管理员可以在机器上设置,由360以及QQ发行的托管程序,只能访问显卡(绘制界面)以及读写网络,而不能执行访问磁盘文件等操作。

执行代码安全的前提是,整个程序完全是由托管代码写成的,如果托管代码里混合非托管代码,无论是通过托管C++写成的,还是里面执行了平台调用(P/Invoke)。就破坏规矩了,因为非托管代码可以使用指针操作,以及调用其它非托管代码的方式,甚至—启动一个进程,然后将原来的托管程序杀掉。因此,进行代码访问安全的前提条件是,整个应用程序都是使用托管代码写成的,为了保证这个前提条件,CLR在执行托管程序之前,首先会验证程序是否满足—整个程序都是用托管代码编写这一条件。如果不满足这个条件,那么CLR会扔出VerificationException,中断托管程序的执行,在.NET SDK里,你可以通过PEVerify.exe这个程序验证一个程序是否可以通过这个验证。

 

当然,你可能会说,很多本机运行的托管程序,即使调用了非托管代码,例如执行了一个平台调用,还是可以照常执行啊。那是因为,当你的程序使用了/unsafe编译选项时,C#编译器会自动在托管程序添加上SuppressUnmanagedCodeSecurityAttribute这个属性,这个属性告诉CLR。如果程序是在本机执行,那么就跳过验证是否调用了非托管代码这一环节。有兴趣的读者可以把调用非托管代码的托管程序放在一个网络路径上,从那里执行,应该就可以看到SecurityException了。

 

回到ASP.NET网站的情形,当你将ASP.NET网站的装配件(Assembly)使用 vsinstr.exe创建一个可以收集代码覆盖率的装配件(Assembly)时,vsinstr.exe实际上在装配件(Assembly)的IL代码里,添加了很多收集代码覆盖率的代码。这个过程可以参考我以前的文章:软件自动化测试—代码覆盖率。这些代码里,有一个很重要的步骤,就是联系本机运行的VSPerfMon.exeVSPerfMon.exe是用来收集整个机器上代码覆盖率的,不知道是什么愿意,联系本机运行的VSPerfMon.exe过程是通过非托管的API实现的,这就意味着vsinstr.exe生成的 装配件(Assembly)就必须调用到非托管代码,因此也就通过CLR的验证过程。

 

在2.0的时候,你可能还不会碰到这个问题,但是在4.0里面,你就很有可能碰到这个问题—特别是在网站运行在IIS下的话,经常发生。

 

既然道理已经明白了,修复起来也很容易:

  1. 将网站,以及所有需要做代码覆盖率的装配件(Assembly)—也就是被vsinstr.exe处理过的装配件(Assembly),在它们的源代码(既然你要收集代码覆盖率,那肯定是由源代码的)里的AssemblyInfo.cs里,加上下面这一行

 

[assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust=true)]

 

  1. 然后在网站的web.config里,做如下修改(这个选项也可以通过IISAdmin.exe修改):

 

 <system.web>

    <trust level="Medium" />

 

     …

 </system.web>

 

说明,SecurityRules这个属性,告诉CLR,这个装配件(Assembly)有自定义的安全机制,SecurityRuleSet.Level1说明采用.NET 2.0下面的安全验证策略,SkipVerificationInFullTrust告诉CLR,只有网站运行在FullTrust模式下,才可以跳过安全验证。最后第二步就是将网站的运行模式改在FullTrust模式下。

标签:  CLR


本文转自 donjuan 博客园博客,原文链接:   http://www.cnblogs.com/killmyday/archive/2010/11/16/1878847.html ,如需转载请自行联系原作者
相关文章
|
3月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
184 3
|
3月前
|
安全 测试技术
北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率
【10月更文挑战第1天】北京大学李戈教授团队提出了一种名为“统一生成测试”的创新方法,有效提升了大模型如GPT-2和GPT-3在单一测试中的代码生成覆盖率,分别从56%提升至72%和从61%提升至78%。这种方法结合了模糊测试、变异测试和生成对抗网络等多种技术,克服了传统测试方法的局限性,在大模型测试领域实现了重要突破,有助于提高系统的可靠性和安全性。然而,该方法的实现复杂度较高且实际应用效果仍需进一步验证。论文可从此链接下载:【https://drive.weixin.qq.com/s?k=ACAAewd0AA48Z2kXrJ】
87 1
|
4月前
|
人工智能 测试技术 开发者
北大李戈团队提出大模型单测生成新方法,显著提升代码测试覆盖率
【9月更文挑战第27天】北京大学李戈团队在人工智能领域取得重要突破,提出HITS新方法,通过将待测方法分解为多个切片并利用大型语言模型逐个生成测试用例,显著提升代码测试覆盖率,尤其在处理复杂方法时效果显著,为软件开发和测试领域带来新希望。尽管存在一定局限性,HITS仍展示了巨大潜力,未来有望克服限制,推动软件测试领域的创新发展。论文详情见【https://www.arxiv.org/pdf/2408.11324】。
149 6
|
3月前
|
设计模式 关系型数据库 测试技术
进阶技巧:提高单元测试覆盖率与代码质量
【10月更文挑战第14天】随着软件复杂性的不断增加,确保代码质量的重要性日益凸显。单元测试作为软件开发过程中的一个重要环节,对于提高代码质量、减少bug以及加快开发速度都有着不可替代的作用。本文将探讨如何优化单元测试以达到更高的测试覆盖率,并确保代码质量。我们将从编写有效的测试用例策略入手,讨论如何避免常见的测试陷阱,使用mocking工具模拟依赖项,以及如何重构难以测试的代码。
78 4
|
3月前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
139 1
|
4月前
|
存储 安全 物联网
.NET 跨平台工业物联网网关解决方案
【9月更文挑战第28天】本文介绍了利用 .NET 构建跨平台工业物联网网关的解决方案。通过 .NET Core 和多种通信协议(如 MQTT 和 Modbus),实现工业设备的高效接入和数据采集。系统架构包括设备接入层、数据处理层、通信层、应用层和数据库层,确保数据的准确采集、实时处理和安全传输。此外,还详细阐述了设备身份认证、数据加密及安全审计等机制,确保系统的安全性。该方案适用于不同操作系统和工业环境,具备高度灵活性和扩展性。
106 1
|
5月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
|
5月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
127 1
|
5月前
|
API C#
.NET电子邮件高效处理解决方案
.NET电子邮件高效处理解决方案
|
6月前
|
测试技术
单元测试策略问题之行覆盖率和分支覆盖率之间的问题如何解决
单元测试策略问题之行覆盖率和分支覆盖率之间的问题如何解决
223 7