当图像url空格编码为+时,ASP.Net Core返回404

问题描述 投票:1回答:1

我将URL存储在数据库中,其中空格被编码为+。当浏览器请求这些URL时,Web服务器返回404响应。这些URL全部用于存储在wwwroot文件夹中的Web服务器上的静态图像。如果我为+手动更改%20,则会正确返回图像。

这是ASP.Net Core的故意改变还是这个错误?如果是故意的,那么我通过数据库并重新编码所有URL会非常痛苦,其中许多URL都嵌入在HTML片段中(我知道在数据库中存储HTML或在图像文件中有空格不是一个好主意,但它早在我加入公司之前就完成了,这就是我们已经进入的状态。

我正在使用ASP.Net 2.1,在.Net Framework上运行。它目前正在运行IIS Express(在开发期间),但将使用完整的IIS进行部署。

我已经看到this的其他问题,但它特别与API调用有关,答案似乎不适用于我的问题,因为我没有要更改的路由,因为我正在请求静态图像文件。

编辑:额外细节使用@Html.Raw(html)输出html生成的浏览器html输出格式为<img src="/BorderThemes/grey+4px+rounded+corners_TL.png" />

Html是在服务器上生成的,然后存储在数据库中,因此我们可以确信输出到浏览器是安全的,不,我不知道为什么有人会这样做,而不是在需要时构建HTML但是之前我的时间,这是我已经在的情况。

更新:我已经深入研究了这个问题,如果我将http://localhost:8000/BorderThemes/grey+4px+rounded+corners_TL.png输入到我的网络浏览器中,我会从IIS获取一个页面,说Http Error 404.11说我的URL是双重编码的,并链接到here以获取更多信息。这包括有关如何允许双重编码的说明,但警告说它可能会产生安全后果。如果我输入网址http://localhost:8000/BorderThemes/grey%204px%20rounded%20corners_TL.png,我会得到一张图片。

我遇到了存储在数据库中的路径/ html的问题,但经过实验,看来System.Net.WebUtility.UrlEncode将空格编码为+。例如,WebUtility.UrlEncode("foo bar.png")返回foo+bar.png,由IIS进行双重编码而被拒绝。

我是否遗漏了某些内容,或者Microsoft是否以微软Web服务器拒绝的方式编码URL编码URL?

c# asp.net-core
1个回答
1
投票

如果你想要%20而不是+尝试使用EscapeDataString来编码URI:

Uri.EscapeDataString(someString);

请参阅https://stackoverflow.com/a/50682381/704008

但是你已经生成了url并且现在无法做任何事情,所以尝试使用HtmlEncode之类的

System.Net.WebUtility.HtmlDecode.HtmlDecode(html);

我不确定最好使用Raw或某些方法如decode中的@Html但尝试使用:

@Html.Raw(System.Net.WebUtility.HtmlDecode(html))

参考:https://docs.microsoft.com/en-us/dotnet/api/system.net.webutility?view=netstandard-2.0

https://docs.microsoft.com/en-us/dotnet/api/system.net.webutility.urldecode?view=netstandard-2.0#System_Net_WebUtility_UrlDecode_System_String_

© www.soinside.com 2019 - 2024. All rights reserved.