允许双 URL 编码的请求路径有效

2024-02-14

我有一个在 IIS 7.0 上运行的标准 ASP.Net WebForms 应用程序,带有集成托管管道。我们网站上的许多图像的文件名中都有空格(例如'./baseball drawing.gif')。当我们将这些图像放入 html 页面时,我们对路径进行 url 编码,以便我们的 html img 标签看起来像这样 img src='./baseball%20drawing.gif' />

现在,当某些搜索引擎和网络爬虫尝试对我们的网站建立索引时,问题就出现了。当他们抓取我们的页面时,他们会对我们已经 html 编码的路径进行 html 编码,获取像这样的图像链接'./baseball%2520drawing.gif' where %25是 '%' 的 url 编码。这会导致两个问题:

  1. 当用户从这些搜索引擎获取结果时,他们会收到损坏的链接。
  2. 当用户尝试导航到这些损坏的链接时,它会在我们的系统中引发错误。

正如你所看到的,这是一个双输的局面。用户会收到损坏的链接,并且我们会在错误日志中收到噪音。

我一直在试图找出如何解决这个问题但没有运气。这是我尝试过的:

  1. Set <requestFiltering allowDoubleEscaping='true'>在 web.config 中防止“404.11 URL 双重转义错误”。这修复了第一个错误,但导致了一个新错误,“发现了潜在危险的 Request.Path”。
  2. 删除了“%”<httpRuntime requestPathInvalidChars>以防止“潜在危险的Request.Path”错误。这修复了第二个错误,但现在我们有了第三个错误,“找不到资源”。
  3. 我在代码中放置了一个中断来观看Request.Path。看起来值“Ball Image.gif”而不是“Ball%2520Image.gif”是正确的。在这种情况下,我不确定为什么它不起作用。

我觉得我有一个超级黑客,我必须禁用所有功能,而没有真正理解为什么没有任何效果。所以我想我的问题有三个方面

  1. 为什么解决方案尝试 1 无法解决问题?
  2. 为什么解决方案2没有解决问题?
  3. 为什么我的 Request.Path 在步骤 3 中看起来正确,但仍然不起作用?

任何人可以提供的任何帮助将不胜感激。


好吧,经过大量的互联网搜索和大量的实验后,我想我终于明白发生了什么。我的主要问题是极端的确认偏差。我读到的所有内容都是我想听的,而不是实际所说的。为了回答我的问题,我将大大总结我需要理解的要点。

  1. 首先,我需要了解 IIS 和 ASP.Net 是两个不同的应用程序。简而言之,IIS 的作用是接收请求,将该请求路由到处理该请求的应用程序,从处理应用程序获取输出,然后将应用程序的输出发送回请求者。 ASP.Net 的作用是接收来自 IIS 的请求,处理它,然后将响应传递回 IIS。这是对整个过程的过度概括,但就我的目的而言,这已经足够好了。1 http://learn.iis.net/page.aspx/243/aspnet-integration-with-iis/

  2. 传入的 ASP.Net 请求必须通过两个网守。 IIS7 RequestFiltering模块(在system.webserver/requestFiltering中配置2 http://www.iis.net/ConfigReference/system.webServer/security/requestFiltering),然后是 ASP.Net HttpRuntime 请求过滤器(在 system.web/httpRuntime 中配置3 http://msdn.microsoft.com/en-us/library/e1f13641.aspx).

  3. IIS RequestFiltering 模块是唯一对传入请求进行规范化的模块,并且它仅应用规范化一次。我再次重复一遍,它只应用一次。即使<requestFiltering allowDoubleEscaping="true" />它仍然只会应用一次标准化。这意味着“%2520”将被标准化为“%20”。此时,如果 allowedDoubleEscaping 为 false,IIS 将不会让请求通过,因为“%20”仍可以正常化。但是,如果将allowDoubleEscaping 设置为true,则IIS7 会将请求“%20”传递给下一个网守ASP.Net。这是第一个错误的原因。

  4. Asp.net 过滤器是检查 requestPathInvalidCharacters 的地方。所以现在我们的 '%20' 无效,因为默认情况下 '%' 是 requestPathInvalidCharacters 的一部分。如果我们从该列表中删除“%”,我们将使其通过第二个网守,并且 ASP.Net 将尝试处理我们的请求。这就是第二个错误的原因。

  5. 现在 ASP.net 将尝试将我们的虚拟路径转换为服务器上的物理路径。不幸的是,我们的路径中仍然有一个“%20”,而不是我们想要的“ ”,因此 ASP.Net 无法找到我们想要的资源,并抛出“找不到资源错误”。当我闯入代码时,该路径看起来正确的原因是我在 Request.Url 属性上放置了一个监视。该属性试图通过在其 ToString() 方法中应用其自己的规范化来提供帮助,从而使我们的 %20 看起来像我们想要的 ' ',尽管事实并非如此。这就是导致最终错误的原因。

为了完成这项工作,我们可以编写自己的自定义模块,该模块在前两个网守之后接收请求,并在将其传递给 ASP.Net 之前对其进行完全规范化。不过,这样做将允许任何字符通过,只要它是 URL 编码的。例如,我们通常不想在路径中允许使用“”,因为它们可用于将标签插入到我们的代码中。目前, 不会通过 ASP.Net 过滤器,因为它们是 requestPathInvalidCharacters 的一部分。但是,如果我们打开前两个门,然后在我们自己的自定义模块中规范化请求,然后再将其传递给 ASP.Net,则可以将其编码为 %253C 和 %253E。

总之,如果不造成大的安全漏洞,就不可能允许 %2520 完全标准化。如果可以告诉 RequestFiltering 模块在针对前两个网守测试该请求之前完全规范化它收到的每个请求,那么它会更安全,但现在该功能不可用。

如果我有任何问题,请告诉我,我希望这对某人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

允许双 URL 编码的请求路径有效 的相关文章

  • 我的机器密钥是自动生成的还是隔离的?

    我正在尝试分享 ASPXAUTHASP NET MVC 4 应用程序 在 IIS 7 5 中 和使用的服务之间的 cookieHttpListener在同一主机上 浏览器正确地向两者呈现 cookie 但我的服务收到System Web H
  • 如何使用 ASP.NET Web 表单从代码隐藏中访问更新面板内的文本框、标签

    我在更新面板中定义了一些控件 它们绑定到中继器控件 我需要根据匿名字段隐藏和显示用户名和国家 地区 但问题是我无法以编程方式访问更新面板中定义的控件 我如何访问这些控件 我也在网上查找但找不到很多参考资料 下面是来自aspx页面和 cs页面
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 如何在aspx页面中的repeater ItemDataBound函数中传递Control.ClientID?

    我想调用 JavaScript 函数来折叠 展开 我在 asp repeater 中使用此代码ItemTemplate在跨度上 onclick javascript funCollExp this 我该如何通过Control ClientI
  • 设置asp.net验证器的顺序

    我使用 3 个验证器来验证文本框 但当在文本框中输入无效值时 所有验证器都会被触发 但我希望这些验证器按照特定的顺序工作 以便用户可以一一解决这些错误
  • 您会认为这是单例/单例模式吗?

    想象一下 在 Global asax cs 文件中 我有一个实例类作为私有字段 我们这样说 private MyClass myClass new MyClass 我在 Global 上有一个名为 GetMyClass 的静态方法 它获取当
  • 如何使用 ViewBag 创建 BaseController

    我需要执行以下操作 我已经准备好一些控制器并正在运行 但现在我想创建一个BaseController 我的每一个Controllers应该像这样继承它 public class MySecondController BaseControll
  • 为什么 appcmd.exe 解锁配置在 Azure 模拟器上不起作用?

    我最近升级到 Azure 2 1 SDK 现在我的部分功能遇到了问题web config在计算模拟器上运行时处于 Web 角色中 我的web config包含这个
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在asp.net中创建动态复选框

    我正在创建一个需要添加动态复选框列表的应用程序 请任何人告诉我如何使用 C 添加动态复选框列表 在表单上放置一个带有 ID 的占位符placeHolder并将以下代码添加到您的Page Load CheckBoxList cbList ne
  • 在 asp.net vb 中通过第一个下拉列表值填充第二个下拉列表

    我在使用 asp net vb 时遇到了一些问题 我想做的是有2个下拉框 第一个下拉菜单将有 1 2 3 例如 第二个下拉菜单将有 A 乙 C 默认情况下 但是 如果选择 1 我希望第二个下拉菜单自动选择 c 我不知道 JavaScript
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • Medium Trust 中允许哪些反射权限?

    我想问一下Medium Trust中允许使用哪些方法 类 例如 这些方法是否被允许 获取属性 获取方法 激活器 CreateInstance 汇编版本 程序集名称 名称 请告诉我哪些方法是允许的 GetMethods 和 Activator
  • Automapper、Mapper 未初始化。使用正确的配置调用初始化

    当我尝试将数据提交到数据库时 出现以下错误 Success false Error true ErrorType 2 Message System InvalidOperationException Mapper 未初始化 使用适当的配置调
  • 处理 MVC 中的创建和修改日期

    你好 我有一个 MVC 应用程序 它有 CreatedDate 和 ModifiedDate 字段 1 CreatedDate是用户创建模块的时间 任何条目 2 ModifiedDate是用户编辑模块的时间 我有以下模型类 namespac
  • 如何反序列化 XML 文档

    如何反序列化此 XML 文档
  • 向客户端发送状态码 500 时页面未呈现

    我有一个页面 通用处理程序 我想在该页面上向客户端返回状态代码 500 以指示出现问题 我这样做 Response StatusCode 500 Response StatusDescription Internal Server Erro
  • Web 和 winforms 的 .Net 身份验证

    我有一个为客户端构建的 ASP NET Web 应用程序 它使用默认的 ASP NET 表单身份验证 他们现在请求一个能够 与 Web 应用程序一起工作的桌面 WinForms 应用程序 我已经创建了 Web 服务来访问他们想要从 Web

随机推荐

  • Angular 5 动态更改 i18n 语言环境

    我正在尝试动态更改语言环境以更改 i18n 语言 我有两个文件 一个包含英语值 另一个包含法语值 我现在尝试过的是这样的 ngOnInit const localeName localStorage getItem locale fr im
  • 如何在 Clojure 中拆分数字?

    我正在寻找一种很好的方法来分割数字nClojure 中的数字我有以下两种方法 gt gt str 942 seq map str map read string gt 9 4 2 and defn digits n cons str mod
  • 无法在onCreate中创建相机预览?

    我在 Android 上预览相机时遇到一些问题 现在我有一个按钮 您需要按下才能预览相机 但我希望在启动应用程序后立即进行预览 如果我尝试将启动预览的部分从按钮中取出并将其放入 onCreate 中 它将无法工作 预览也不会启动 如何在用户
  • 按两个条件分割字符串 - 通配符

    我需要用一个字符加一个通配符来分割字符串 text1 CompanyA XYZ 257999 31 12 2000 text2 CompanyB XYZ 057999 31 12 2000 我想在位置 2 或 0 处分割该字符串 就在 XY
  • 如何用汇编语言查看EIP值? [复制]

    这个问题在这里已经有答案了 我想用汇编语言获取EIP寄存器的当前值 那可能吗 假设32位x86 使用以下函数 get eip mov eax esp ret 然后 要获取EAX中EIP的值 只需 call get eip
  • 如何将 git 凭据添加到构建中,以便能够在 shell 代码中使用它?

    我写了以下 Jenkinsfile node master def artifactory creds XXXXXXX def git creds XXXXXXX java docker image openjdk 8 jdk java p
  • Android中的自定义对象点击问题

    I have created an custom view in android to display ball on screen Now what I want is when I touch on that ball it shoul
  • 使用 API 将 ics 文件导入到 Google 日历

    是否有任何可能的解决方案可以使用他们的 API 将 ics 文件导入谷歌日历 我参考了很多博客 但找不到适合我需要的确切解决方案 我正在节点应用程序中工作并使用节点模块创建 ics 文件 请帮我找到解决方案 提前致谢 日历 API v3 不
  • 如何在 Mac OS X 10.8 上编译 FreeImage?

    尝试使用 make 在 Mac OS X 10 8 上构建 FreeImage 3 1 5 4 时make出现以下错误g 4 0 No such file or directory发生 有关编译器配置的 makefile 有问题 如何解决这
  • Retrofit2 上的 HTTPs SSLProtocolException

    我在 Android 4 4 手机 特别是 Galaxy S4 尽管我相信这不是手机本身的问题 上遇到了问题 使用 Retrofit2 Http 在 HTTPS 连接时收到以下错误 javax net ssl SSLHandshakeExc
  • 以“select 语句”格式从函数返回结果

    我有一个如下所示的函数 CREATE OR REPLACE FUNCTION mffcu test ty hey RETURNS setof record LANGUAGE plpgsql AS function Declare cname
  • 使用 fromkeys 和可变对象创建字典。一个惊喜[重复]

    这个问题在这里已经有答案了 我在 Python 2 6 和 3 2 中遇到了令我惊讶的行为 gt gt gt xs dict fromkeys range 2 gt gt gt xs 0 1 gt gt gt xs 0 append 1 g
  • 具有不同高度项目的网格布局(React Native)

    Any idea for implementing a grid layout like the following image 答案取决于您要显示的数据 我想这是一个无限列表 向下滚动时会加载更多项目 如果是这种情况 你需要输入 3Lis
  • 流畅的 NHibernate QueryOver 选择不在另一个表中的项目(左连接)

    我有两张桌子 all 编号 丙A 道具B 其他一些专栏 hidden 编号 丙A 道具B 和相应的类 已映射 尚未映射关系 我想从第一个表中获取所有行 减去匹配的任何结果propA or propB财产 我设法通过 Criteria API
  • 重定向 Rails 4 中特定控制器的记录器输出

    我根据上一个问题的答案构建了一个解决方案重定向 Rails 3 中特定控制器的记录器输出 https stackoverflow com q 28821668 56082对于 Rails 3 它工作得很好 但是现在我尝试将相同的基于中间件的
  • buildQueryString 函数的 Purescript 类型

    我是 Purescript 的新手 我正在尝试编写一个函数 可以获取任何记录值并迭代字段和值并构建 一个查询字符串 我在想这样的事情 buildQueryString forall a PropertyTraversible r gt r
  • 复选框操作

    由于某种原因 这段小代码阻止用户检查实际的复选框并将复选标记放入其中 而检查它的唯一方法是单击该行 table tr click function checkBox this children td children input type
  • Cygwin git Push 挂起,msysgit 还好

    我使用代理 而且我对 git 很陌生 而且我使用的是 Windows XP 我已经能够制作一个git push origin master从 msysgit 工作 但无法使用 Cygwin 的 git 在 Cygwin 中工作 我在两个环境
  • 如何在 ASP Dropdownlist 列表项中使用彩色圆圈? (没有 jQuery)

    Goal 我想要一个下拉列表 如果某人的可用性为 True 则显示绿色 如果某人的可用性为 False 则显示红色 注意 我需要在没有 jQuery 的情况下完成此操作 我刚刚被告知我们不允许在我们的项目中使用 jquery 问题 背景 我
  • 允许双 URL 编码的请求路径有效

    我有一个在 IIS 7 0 上运行的标准 ASP Net WebForms 应用程序 带有集成托管管道 我们网站上的许多图像的文件名中都有空格 例如 baseball drawing gif 当我们将这些图像放入 html 页面时 我们对路