【问题标题】:Mvc 3 - Controller as image handler, how to pass a path?Mvc 3 - 控制器作为图像处理程序,如何传递路径?
【发布时间】:2011-07-26 08:43:27
【问题描述】:

我正在尝试将控制器用作图像处理程序,但我如何将路径传递给它?

现在看起来像这样(适用于没有路径的图像):

public void GetImage(string parameter)
{
    var imageHandler = UnityGlobalContainer.Container.Resolve<IImageHandler>();
    imageHandler.ProcessRequest(parameter);
}

但如果我尝试发送路径 folder1\folder2\folder3\picture.jpg 则失败。

@Html.ActionLink("Show", "GetImage", "Utility", new { parameter = @"folder1\folder2\folder3\picture.jpg" }, new { })

产生这个: http://localhost:58359/Utility/GetImage/folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg

这会导致: HTTP 错误 400 - 错误请求。

如何使用普通的 mvc 方法将路径传递给控制器​​? (我使用的是反斜杠而不是正斜杠) 我还测试了在参数上使用 HttpUtility.UrlEncode。

【问题讨论】:

    标签: c# asp.net-mvc-3 controller


    【解决方案1】:

    根据您的代码:html页面中生成的链接应该是: http://localhost:58359/Utility/GetImage?parameter=folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg 并且参数变量应该在action方法中正确设置为“folder1\folder2\folder3\picture.jpg”。

    请注意,您可能在此处容易受到directory traversal 的攻击。

    【讨论】:

    • 这不违反 mvc 路径吗?
    • 抱歉,没有理解你所说的 mvc 路径。能否在html中添加view生成的url(查看渲染页面的html源代码)和controller方法中变量“parameter”的值(只要在那里设置断点)?另外,你有 GetImage Action 的特殊路线吗?
    【解决方案2】:

    在 .NET 4.0 beta 2 中,CLR 团队提供了一种解决方法。

    将此添加到您的 web.config 文件中:

    <uri> 
        <schemeSettings>
            <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
        </schemeSettings>
    </uri>
    

    这会导致 Uri 类根据 RFC 描述 URI 的行为,允许在路径中转义斜杠而不进行转义。 CLR 团队报告说,出于安全原因,他们偏离了规范,并且在您的 .config 文件中进行设置基本上可以让您掌握不转义斜杠所涉及的其他安全考虑因素。

    【讨论】:

      【解决方案3】:

      【讨论】:

      • URL 甚至不会触发控制器。我无法解码我没有得到的东西=/
      【解决方案4】:

      不要将文件名参数称为“参数”并在您的路由中定义它,而是将其称为“文件名”并且不要在您的路由中定义它。

      您的操作代码将是相同的,但文件名将不再是路由的一部分,而只是一个普通的 URL 参数。

      如果您因不喜欢 URL 参数而受到本季时尚的困扰,那么您可能会觉得这种做法令人反感,但这只是时尚,可以放心地忽略。

      就个人而言,我不会将这样的路径传递到 Web 应用程序中,因为我绝对会偏执于错误地创建遍历威胁 - 我只传递无路径文件名,根据列表验证它们,然后获取文件。

      【讨论】:

        猜你喜欢
        • 2011-09-25
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多