【问题标题】:Decode escaped Url without using HttpUtility.UrlDecode在不使用 HttpUtility.UrlDecode 的情况下解码转义的 Url
【发布时间】:2010-09-19 08:50:00
【问题描述】:

是否有任何函数可以将转义的 Url 字符串转换为其非转义形式? System.Web.HttpUtility.UrlDecode() 可以完成这项工作,但我不想添加对 System.Web.dll 的引用。由于我的应用程序不是 Web 应用程序,因此我不想添加仅在程序集中使用函数的依赖项。

更新:检查Rick Strahl's blog post关于同样的问题。

【问题讨论】:

  • Rick Strahl 的帖子是必读的 - 它包含必要的背景知识和对 .NET 框架提供(或不提供)的不同解决方案的深入分析。

标签: .net url


【解决方案1】:

稍微了解一下为什么会有所不同。一个转换为大写,一个转换为小写。所以解码是特定于编码类型的。

System.Net.WebUtility(内部)+ 65

private static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 65);
}

System.Web.Util.HttpEncoderUtility(内部)- + 97

public static char IntToHex(int n)
{
    if (n <= 9)
        return (char) (n + 48);
    else
        return (char) (n - 10 + 97);
}

示例

var test1 = WebUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");
var test2 = HttpUtility.UrlEncode("http://www.test.com/?param1=22&param2=there@is<a space");

回应

test1 -> http%3A%2F%2Fwww.test.com%2F%3Fparam1%3D22%26param2%3Dthere%40is%3Ca+space
test2 -> http%3a%2f%2fwww.test.com%2f%3fparam1%3d22%26param2%3dthere%40is%3ca+space

More information....

【讨论】:

    【解决方案2】:

    如果您使用的是 .NET 4.0 或更高版本,则可以使用WebUtility.UrlDecode,它适用于客户端配置文件,并且还可以正确处理加号(请参阅this 讨论)。

    【讨论】:

      【解决方案3】:

      System.Net.WebUtility.HtmlDecode 也在开发 .NET 4.0 客户端配置文件。

      【讨论】:

      • Url endcoding/decoding != Html encoding/decoding.
      【解决方案4】:

      @史密斯
      我遇到了保存问题。没有变化或只是进一步混乱。

      在测试了很多东西后,我注意到一个测试字符串确实解码了。最终我不得不创建一个新的空字符串,将其值设置为编码字符串,然后在新字符串上运行 WebUtility.HtmlDecodeUri.UnescapeDataString。出于某种原因,我不得不按照我提到的顺序运行解码和取消转义。奇怪。

      我用这样的方法解决了。

      Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d"
      
      Dim strDecoded as string = ""
      strDecoded = strEncoded
      strDecoded = WebUtility.HtmlDecode(strDecoded)
      strDecoded = Uri.UnescapeDataString(strDecoded)
      

      【讨论】:

        【解决方案5】:

        编辑:使用静态方法Uri.UnescapeDataString()解码您的网址:

        编码: http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

        解码: http://www.google.com/search?hl=en&amp;q=something #23&amp;btnG=Google+Search&amp;aq=f&amp;oq=

        【讨论】:

        • 这对我不起作用,它只是将原始字符串传递给Uri.UnescapeDataString(myurl)
        • 注意:这不适用于加号 - blogs.msdn.com/b/yangxind/archive/2006/11/09/… 我仍在寻找更好的方法。
        • @Chris:Rick Strahl 围绕Uri.UnescapeDataString() 构建了一个实用程序类,可以正确处理+ 标志。请参阅his blog post 了解更多详情。
        • 四年后——我认为 UnescapeDataString 现在处理加号。 repl.it/repls/MildGlossyPorts
        【解决方案6】:

        不再加载 System.Web.dll - 正如其他人所指出的,除非您知道您需要处理可能没有它的客户端(“客户端配置文件”、“紧凑框架”、 “微框架”、“silverlight”)。

        重新空间;真的不会很多;请注意,.NET 程序集是按方法进行 JIT 处理的,因此仅使用几种方法不会产生任何重大开销。

        真正的问题 (IMO) 是您对客户端拥有 System.Web.dll 的信心程度;如果您对他们使用完整的框架感到满意,那就去吧。

        【讨论】:

        • System.Web.dll 非常很重,对启动有明显的影响。
        • @ComputerLinguist 在 vNext 上滚动,嗯?
        • 7 年没有其他事情发生了吗?我的意思是,vNext 必须这样做。
        【解决方案7】:

        您已经非常依赖 .NET 框架、CLR 等。所以,事实上,您已经间接依赖 System.Web.DLL;如果没有本地计算机上的存在,您的应用程序将无法运行。

        你担心记忆?你有记忆问题吗?如果您的内存问题非常严重,以至于无法将几 KB 的 DLL 加载到应用程序的内存中,那么您为什么要编写 .NET 代码?或者你只是过早地优化?

        所以不用担心。

        【讨论】:

        • 你的断言不正确; “client profile”、“cf”和“silverlight”都将缺少 System.Web.dll; “客户端配置文件”是常规 .NET 的一个版本,因此是最引人注目的。
        • @marc iirc 当这个问题得到回答时,客户资料没有发布/众所周知。其次,他没有说是什么类型的应用程序,实际上从他提出问题的方式来看,很明显它是引用 system.web.dll 的一个选项。否则这个问题没有实际意义。所以我的断言很可能是正确的。尼亚。
        【解决方案8】:

        Microsoft ACE 团队在Anti-XSS library 中有一个扩展(和更好)的解码版本。但是我不确定它是否只是通过。

        (说实话,我不明白你为什么那么担心对 System.web.dll 的依赖)

        【讨论】:

        • 原因是我不想为了一个方法调用而将一个相当大的DLL加载到我的内存空间中。如果有人指出我可以复制/粘贴到我的项目中的实现(可能使用正则表达式),那就太好了。
        • 正则表达式解决方案是不够的;解码是hard。如果你真的担心那么,咳嗽,反射器。你真的看过加载程序集的内存成本吗?它可能没有你想象的那么大。
        • 请注意,不同的框架版本(尤其是“客户端配置文件”)是避免它的正当理由 - 但不值得为它兴奋;-p
        • 其实AntiXss库不提供解码方式,只提供编码方式。
        猜你喜欢
        • 1970-01-01
        • 2020-11-20
        • 2021-05-26
        • 2016-05-25
        • 2013-01-11
        • 2017-06-29
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多