【问题标题】:ASP.Net Core Returning 404 when image url spaces encoded as +当图像 url 空间编码为 + 时,ASP.Net Core 返回 404
【发布时间】:2018-09-12 09:50:11
【问题描述】:

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

这是对 ASP.Net Core 的故意更改还是一个错误? 如果是故意的,那么遍历数据库并重新编码所有 URL 对我来说将是非常痛苦的,其中许多都嵌入在 HTML sn-ps 中(我知道将 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 以获取更多信息。这确实包括有关如何允许双重编码的说明,但警告它可能会产生安全后果。 如果我输入 url 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 的 URL 编码功能以 Microsoft 的 Web 服务器拒绝的方式对 URL 进行编码?

【问题讨论】:

  • 在确定它是否是错误之前可以先处理代码示例; “如何”和您的用法很重要。我更多来自网络表单世界,但在某些地方我习惯调用 UrlEncode() 函数。
  • @Phill - 我添加了额外的细节 - 生成页面时没有进行编码,它是以前编码的并存储在数据库中(通常是很多年前)。我只需要将 sn-ps 作为页面的一部分输出。
  • 您需要防止生成+ 标志。如果您的数据库包含这些+s,您需要删除它们。特别是不要使用 UrlEncode()!要获得进一步的帮助,(1) 显示如何填充 html 变量,以及 (2) 显示如何在 Razor 代码中使用 html 变量。
  • @Peter B - 我的问题是我没有编码任何东西,它在很多情况下是多年前编码并存储在数据库中的。我宁愿避免解析所有存储的 HTML sn-ps 并重新编码它们。
  • 修复它可能是您唯一的选择。如果数据不正确,则需要使用数据库脚本进行修复,或者在 C# 代码的每次请求时进行修复。尝试使用System.Net.WebUtility.UrlDecode(),更多信息请参见here

标签: c# asp.net-core


【解决方案1】:

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

Uri.EscapeDataString(someString);

参考https://stackoverflow.com/a/50682381/704008

但是你已经生成了 url 并且现在不能做任何事情所以尝试使用 HtmlDecode

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

我不确定最好与Raw 一起使用,或者在@Html 中存在诸如decode 之类的方法,但请尝试使用:

@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_

【讨论】:

    猜你喜欢
    • 2019-04-25
    • 2019-03-08
    • 1970-01-01
    • 2016-06-04
    • 2021-02-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多