防止"潜在危险的Request.Path"在web api中

时间:2018-02-13 17:17:16

标签: c# asp.net-web-api2

我有这个控制器。

    public string Status([FromBody]StatusRequest p)
    {
        string ps= HttpContext.Current.Request["params"];
        return ps;
    }

它接收到这个post参数值(值为xml。Beneath只是其中的一部分):

params=<Transaction hash=9

我得到了这个臭名昭着的错误:

  

从客户端

检测到潜在危险的Request.Form值

我尝试了一些解决方案。 我试图绑定post参数。但是没有运气,它不会束缚它,所以&#39; p&#39;永远是空的。

我尝试在我的控制器所在的目录中设置web.config:

    <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime targetFramework="4.5" requestPathInvalidCharacters="?" />
    <pages validateRequest="false" />
  </system.web>
</configuration>

这些配置对目录中的文件没有影响。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

这确实是一个令人讨厌的例外,因为即使您隐藏了服务器标头,它也会显示服务器标头,如此大的坏人可以对您使用该信息。

我找到了两种对我有帮助的解决方案。让我以星号作为危险符号的示例进行解释(但是您可以通过这种方式处理任何单个符号或符号集)

第一种方法真的很丑,我不能推荐给任何人。但是这里是:

添加到Global.asax.cs代码

protected void Application_Error(object sender, EventArgs e)
{
    if(Context.Request.RawUrl.Contains("*"))
    {
        Server.ClearError();
    }
}

protected void Application_BeginRequest(object sender, EventArgs e)
{
    if(!Context.Request.RawUrl.Contains("*"))
    {
        return;
    }

    var newPath = Context.Request.RawUrl.Replace("*", "");
    base.Context.RewritePath(newPath);
}

就是这样。对于任何带星号的网址,您都可以忽略此烦人的异常,而只需将危险符号替换为所需的任何内容即可。

第二种方式有点棘手,但对我来说要好得多。请记住,如果无法安装IIS的URL Rewrite模块,则不能使用它。选中next article for the details。文章有点陈旧,如果您像我一样使用IIS 10,则需要获取URL Rewrite module here

因此,首先您必须安装此模块。之后,将此部分添加到system.webServer部分的Web配置文件中:

 <rewrite>
      <rules>
        <rule name="Rewrite URL to remove asterisk from path.">
          <match url="^(.*)\*(.*)$" />
          <conditions logicalGrouping="MatchAny" />
          <action type="Rewrite"
                  url="{R:1}{R:2}" />
        </rule>
      </rules>
    </rewrite>

仅此而已。现在, 几乎 任何带有星号的格式错误的网址都可以正常使用,而不会出现此烦人的错误。

为什么差一点?因为如果IIS虚拟目录的名称中出现危险符号,您仍然会遇到异常。

因此,两种方式都可以处理类似http://localhost/WebApplication1/api * / Values

的错误

两种方法都无法使用http://localhost/WebApplication1 * / api / Values这样的网址

答案 1 :(得分:0)

只需从Web.config下的requestPathInvalidCharacters中删除星号

...
<system.web>
        <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,:,\,?" />
...