• 使用VirtualPathUtility.ToAppRelative注意项


    前两天整理asp.net中路径资料,在网上发现这么一篇文章。说要慎用 VirtualPathUtility.ToAppRelative(string str)。
    具体信息截图如下: 文章连接地址 http://blog.sina.com.cn/s/blog_70555f1701011dxh.html

    出于习惯,我还是在VS中作了测试,一开始我认为可能是.net版本原因。因为就在不久前,在网上看到一篇文章指出了Page.ResolveUrl()方法有漏洞。
    而我在VS中测试则没有,后来才想到,可能是.net版本原因,我用的是4.0的,于是我把框架集改成2.0的,果然如作者所说(最后确定,2.0,3.0, 3.5都有该漏洞,具体信息请看我的另一篇文章)。
    好了,言归正传,我认定是.net版本原因后就分别在4.0和2.0的平台上测试了上述代码,没想到结果和作者的都是一样。

    就在都要认同作者观点的时候,突然发现,不对啊!作者这个测试有问题啊。作者最后调用VirtualPathUtility.IsAppRelative()时,传的是"/Default.aspx".并没有包含当前应用程序路径(当前应用程序路径在没有虚拟目录的情况下是"/",有虚拟目录的情况下就是"/虚拟目录名/"),而MSDN上有这样几句话。

    如果应用程序的虚拟路径为 "myapp" 并向 ToAppRelative 方法传入了虚拟路径 "/myApp/sub/default.asp",则得到的应用程序相对路径为 "~/sub/default.aspx"。
    如果 virtualPath 不以当前应用程序路径开头,ToAppRelative 方法将返回该虚拟路径且不进行任何更改。
    如果 virtualPath 与应用程序路径相同,则返回根操作符(代字号 [~])。例如,当前应用程序虚拟目录路径可以从 AppDomainAppVirtualPath 属性访问。

    其中第二句就得很明白,就是要以当前应用程序路径开头,所以在有虚拟目录时IsAppRelative()能正确处理的参数应该是这样“/虚拟目录名/具体文件名.扩展名” .就解释了为什么返回的是“/Default.aspx”,而不是“~/Default.aspx”。
    其实,就算没官方那几句话,也应该能想到的。因为“/Default.aspx”表示的是网站(或Web应用程序)根目录下的文件,它和虚拟目录(当前应用程序根目录)是同级,这样的话虚拟目录下的程序是没法用“~”这样的方式来表示当前应用程序之外的文件的,所以只能不处理直接返回了。

  • 相关阅读:
    Windows Phone 7 中常用Task
    设置Highchart柱子最大宽度( 让 highcharts支持maxPointWidth属性)
    Asp.Net MVC 使用FileResult导出Excel数据文件
    js获取网页高度
    使用window.addEventListener 和 window.attachEvent 判断浏览器
    slimscroll滚动条插件简单用法
    js中如何快速获取数组中的最大值最小值
    js 判断浏览器类型
    python使用ldap进行用户认证
    关于go声明切片的一些疑问
  • 原文地址:https://www.cnblogs.com/weapon/p/2867234.html
Copyright © 2020-2023  润新知