【发布时间】: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