阿里签名中URLEncode于C#URLEncod不同之处

问题

QQ截图20170106155741

如上图所示,阿里云的PercentEncode 转换! 为 %21

PercentEncode 源码为:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
package com.aliyuncs.auth;
 
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
 
public class AcsURLEncoder {
    public final static String URL_ENCODING = "UTF-8";
     
    public static String encode(String value) throws UnsupportedEncodingException {
        return URLEncoder.encode(value, URL_ENCODING);
    }
     
    public static String percentEncode(String value) throws UnsupportedEncodingException{
        return value != null ? URLEncoder.encode(value, URL_ENCODING).replace("+", "%20")
                .replace("*", "%2A").replace("%7E", "~") : null;
    }
}
01
  

查找问题

第三方工具

01
<a href="http://images2015.cnblogs.com/blog/684558/201701/684558-20170106162851378-1970650580.png"><img style="background-image: none; padding-top: 0; padding-left: 0; display: inline; padding-right: 0; border-width: 0" title="QQ截图20170106160805" src="https://images2015.cnblogs.com/blog/684558/201701/684558-20170106162852784-188184266.png" alt="QQ截图20170106160805" width="644" height="170" border="0"></a>
01
  

上图表明的确没有转义!(感叹号)

 

C#中的URLEncode转义

C#中URLEncode,C#中有两种URLEncode,WebUlitityHttpUlitity

01
02
03
04
05
06
07
08
09
10
11
12
13
[TestFixture]
public class TestUlities
 {
     [Test]
     public void Test()
     {
         var url = @"http://img05.taobaocdn.com/bao/uploaded/TB2BVKlfFXXXXarXXXXXXXXXXXX_!!111708970-0-saturn_solar.jpg";
 
         var webUrlEncode = WebUtility.UrlEncode(url);
 
         var httpUrlEncode = HttpUtility.UrlEncode(url);
     }
 }

 

发现都没有转义!(感叹号)

 

WHY

 

In general URIs as defined by RFC 3986 (see Section 2: Characters) may contain any of the following characters:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=`.

Any other character needs to be encoded with the percent-encoding (%hh). Each part of the URI has further restrictions about what characters need to be represented by an percent-encoded word.

 

解决

QQ截图20170106173506

使用以下代码URLEncode 来进行URLEncode

 

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class AliUrlEncodeHelper
  {
      public static string Encode(string str)
      {
          return !string.IsNullOrEmpty(str) ?
              WebUtility.UrlEncode(str).Replace("+", "%20")
              .Replace("*", "%2A")
              .Replace("%7E", "~")
              .Replace("!", "%21")
              .Replace("'","%27")
              .Replace("(", "%28")
              .Replace(")", "%29")
              :str;
      }
  }

结论

阿里的URLEncode 有点过时,或者说自定义的,需要我们特殊处理。

 

附:阿里签名规则

image

 

参考

Which characters make a URL invalid?

Les codes hexas et unicode des caractères usuels, par Nicolas Hoffmann

阿里云签名机制

posted @   霍旭东  阅读(2937)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2015-01-06 [WPF系列]-DynamicResource与StaticResource的区别
2015-01-06 [WPF系列]-DataBinding 绑定计算表达式
2015-01-06 [WPF系列]- Style - Specify width/height as resource in WPF
点击右上角即可分享
微信分享提示