HttpServerUtility.UrlTokenDecode“有时”失败(Base-64 char数组的长度无效。)

时间:2009-09-08 09:31:23

标签: c# asp.net base64

我们有一个IHttpHandler样式表,并在页面中添加<link/>标记,如下所示:

HtmlGenericControl link = new HtmlGenericControl("link");
link.Attributes.Add("rel", "stylesheet");
link.Attributes.Add("href", "stylesheet.axd?d=" +
                                    HttpServerUtility.UrlTokenEncode(token));
head.Controls.Add(link);

stylesheet.axd处理程序中,我们UrlTokenDecode d查询字符串参数如下:

var token = HttpServerUtility.UrlTokenDecode(Request.QueryString["d"]);

这大部分时间都有效,但我们偶尔会在日志中找到以下两个例外之一:

[FormatException: Invalid character in a Base-64 string.]
   System.Convert.FromBase64CharArray(Char[] inArray, Int32 offset, Int32 length)
   System.Web.HttpServerUtility.UrlTokenDecode(String input)
   ...

[FormatException: Invalid length for a Base-64 char array.]
   System.Convert.FromBase64CharArray(Char[] inArray, Int32 offset, Int32 length)
   System.Web.HttpServerUtility.UrlTokenDecode(String input)
   System.Web.HttpServerUtilityWrapper.UrlTokenDecode(String input)
   ...

任何想法会导致这种现象?

说明:

  • 生成的URL是&lt; 1500,所以低于任何已知的URL限制(例如IE:2083)
  • 似乎独立于用户代理(我们对IE6,7,8,FF和Chrome有这些例外)
  • 我们(未经证实的)怀疑包括AntiVirus产品,HTTP代理,浏览器插件
  • 发现了与this远程相关的问题,但它是关于一个视图状态问题

2 个答案:

答案 0 :(得分:0)

我们遇到了类似的问题,因此我们避免使用UrlTokenEncode,原因是base64有时会将尾随字符填充为“==”等等,因此它们无法正确传输到url中。我认为.NET中存在一个错误,但我们将其更改为关注并开始工作。

我们这样做了,它始终有效。

url += "&d=" + HttpServerUtility.UrlEncode( Convert.ToBase64String( ... ))

在接收方,我们只使用

data = Convert.FromBase64String( Request.QueryString["d"] ) 

我们不需要使用UrlDecode,因为查询字符串对象已经以解码格式存储信息。

答案 1 :(得分:0)

UrlTokenDecodeUrlTokenEncode实际上并没有对base64url进行解码/编码,但是无论如何都可以使用它进行一些补充。另外,有些替代方案可能会更好,也可能不会更好。

请参见C#: base64url according to RFC4648