C# 当图像url空间编码为+;
我将URL存储在数据库中,其中空格编码为C# 当图像url空间编码为+;,c#,asp.net-core,C#,Asp.net Core,我将URL存储在数据库中,其中空格编码为+。 当浏览器请求这些URL时,web服务器返回404响应。 这些URL都用于存储在wwwroot文件夹中的web服务器上的静态图像。 如果我手动更改+的%20,则图像将正确返回 这是ASP.Net核心中的故意更改还是一个bug? 如果这是故意的,那么对我来说,检查数据库并重新编码所有URL将是非常痛苦的,其中许多URL都嵌入到HTML片段中(我知道在数据库中存储HTML或在图像文件中使用空格不是一个好主意,但在我加入公司之前很久就已经这样做了,我们已经处
+
。
当浏览器请求这些URL时,web服务器返回404响应。
这些URL都用于存储在wwwroot文件夹中的web服务器上的静态图像。
如果我手动更改+
的%20
,则图像将正确返回
这是ASP.Net核心中的故意更改还是一个bug?
如果这是故意的,那么对我来说,检查数据库并重新编码所有URL将是非常痛苦的,其中许多URL都嵌入到HTML片段中(我知道在数据库中存储HTML或在图像文件中使用空格不是一个好主意,但在我加入公司之前很久就已经这样做了,我们已经处于这种状态)
我正在使用ASP.NET2.1,运行在.NETFramework上。
目前(在开发过程中)它正在通过IIS Express运行,但将与完整的IIS一起部署
我看到了其他的问题,但它是专门针对API调用的,答案似乎不适用于我的问题,因为在我请求静态图像文件时,没有任何更改路径
编辑:额外细节
使用@html.Raw(html)
向浏览器输出的结果html格式如下
Html是在服务器上生成的,然后存储在数据库中,因此我们可以确信输出到浏览器是安全的。不,我不知道为什么有人会这样做,而不是在需要的时候构建Html,但这是在我的时代之前,这是我已经遇到的情况
更新:
我已经对此进行了深入研究,如果我输入http://localhost:8000/BorderThemes/grey+4px+rounded+corners_TL.png
进入我的web浏览器,我从IIS获得一个页面,显示Http错误404.11,表示我的URL是双重编码的,并链接到以获取更多信息。这确实包括关于如何允许双重编码的说明,但警告可能会产生安全后果。
如果我输入urlhttp://localhost:8000/BorderThemes/grey%204px%20rounded%20corners_TL.png
我得到了一张照片
我对数据库中存储的path/html有问题,但经过实验后,似乎System.Net.WebUtility.UrlEncode
将空间编码为+
。例如WebUtility.UrlEncode(“foo-bar.png”)
返回foo+bar.png
,IIS拒绝将其作为双重编码
我是否遗漏了一些东西,或者Microsoft的URL编码功能是否以Microsoft web服务器拒绝的方式对URL进行编码?如果您希望
%20
而不是+
尝试使用转义字符串对URI进行编码:
Uri.EscapeDataString(someString);
提及
但是您已经生成了url&现在不能做任何事情了,所以请尝试使用类似HTML的代码
System.Net.WebUtility.HtmlDecode.HtmlDecode(html);
我不确定是否最好与Raw
一起使用,或者在@Html
中存在类似decode
的方法,但请尝试使用:
@Html.Raw(System.Net.WebUtility.HtmlDecode(html))
参考:
在决定是否是bug之前,可以使用代码示例;“如何”和你的用法很重要。我更多地来自web表单世界,但在某些地方我习惯于调用UrlEncode()函数。@Phill-我添加了额外的细节-在生成页面时没有进行编码,它是以前编码并存储在数据库中的(通常是多年前)。我只需要将代码片段作为页面的一部分输出。您需要防止生成+
符号。如果数据库包含这些+
s,则需要删除它们。特别是不要使用UrlEncode()
!为了获得进一步的帮助,(1)显示html
变量是如何填充的,(2)显示html
变量是如何在Razor代码中使用的。@Peter B-我的问题是我没有编码任何东西,它在很多情况下是多年前编码的,并存储在数据库中。解析所有存储的HTML代码片段并重新编码是我宁愿避免的事情。修复它可能是您唯一的选择。如果数据不正确,则需要修复,要么使用数据库脚本修复一次,要么在您的C#代码每次请求时修复一次。尝试使用System.Net.WebUtility.UrlDecode()
,有关更多信息,请参阅。