通过“HttpUtility.UrlEncode”和“Uri.EscapeDataString”在 GET API 请求中编码撇号会出错

Posted

技术标签:

【中文标题】通过“HttpUtility.UrlEncode”和“Uri.EscapeDataString”在 GET API 请求中编码撇号会出错【英文标题】:Encoding apostrophe in GET API request via "HttpUtility.UrlEncode" and "Uri.EscapeDataString" gives error 【发布时间】:2021-11-25 14:43:41 【问题描述】:

我正在从邮递员发出 GET 请求,我期待得到表列表作为回报: 以下是 URI:https://XYZ/api/Sam's Club Operations Executive P&L Report DS/Tables

此请求会引发错误,因为我们在 URI 中有一个撇号,即 Sam's

我尝试了 HttpUtility.UrlEncode 和 Uri.EscapeDataString 并且在调试时我可以看到 Sam's' 被编码为 Sam%27s 和URI 看起来像 "Sam%27s%20Club%20Operations%20Executive%20P%26L%20Report%20DS"

但是,当我尝试打开连接时,我被抛出异常。我的连接字符串目录字段如下所示:Catalog=Sam%27s%20Club%20Operations%20Executive%20P%26L%20Report%20DS;

抛出的异常是:

"要么数据库'Sam%27s%20Club%20Operations%20Executive%20P%26L%20Report%20DS'不存在, 或者你没有访问它的权限。\r\n\r\n 技术细节:\r\nRootActivityId:f626f5b7-b8ed-4697

我正在使用基本身份验证,并且每次请求都会发送正确的用户名和密码。我该如何克服这个异常。

【问题讨论】:

此错误与 HTTP、ASP.NET Core 或编码无关。服务代码未能解码 URL。这也指出了一个巨大的安全漏洞——服务使用输入而不验证它。想象一下如果有人在 URL 中编码someDb; drop table users-- 会发生什么。如果 URL 的该部分用于表示数据库,则服务甚至不应接受无效名称。它至少应该返回 404 在任何情况下,您都无法在客户端解决任何问题。编码没有错。该服务基本上被破坏了。您必须发布服务代码,以便人们可以帮助修复它 【参考方案1】:

将 URI 编码如下以进行 API 调用: $"\"" + Convert.ToString(WHATEVERURISTRING) + $"\";";

【讨论】:

以上是关于通过“HttpUtility.UrlEncode”和“Uri.EscapeDataString”在 GET API 请求中编码撇号会出错的主要内容,如果未能解决你的问题,请参考以下文章

Dynamics365 Sandbox中部署Plugin不支持HttpUtility.UrlEncode

Dynamics365 Sandbox中部署Plugin不支持HttpUtility.UrlEncode

System.Web.HttpUtility.UrlEncode/UrlDecode ASP.NET 5 的替换

HttpUtility.UrlEncode .net中的UrlEncode

asp及asp.net的urlencode问题

Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办?