通过“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
Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办?