我有这个控制器。
public string Status([FromBody]StatusRequest p)
{
string ps= HttpContext.Current.Request["params"];
return ps;
}
它接收此帖子参数值(值为xml。下方只是其中的一部分(:
params=<Transaction hash=9
我遇到了这个臭名昭著的错误:
潜在的危险请求。从客户端检测到形式值
我尝试了一些解决方案。我试图绑定帖子参数。但是没有运气,它不会绑定它,因此" p"的值始终为null。
我尝试在控制器所在的目录中设置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>
这些配置对目录内的文件没有影响。
有人知道如何解决这个问题吗?
这确实是令人讨厌的例外,因为它揭示了服务器标题,即使您隐藏了它,所以大坏人可以对您使用该信息。
我找到了两种帮助我的解决方案。让我通过使用星号作为危险符号的示例来解释两者(但是您可以以这种方式处理任何单个符号或一组符号(
1st Way 真的很丑陋,我不推荐给任何人。但这是:
添加到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);
}
就是这样。对于任何带有星号的URL,您都会忽略这个烦人的例外,只需将危险符号替换为您想要的任何东西。
2nd Way 稍微棘手,但就我而言,好多了。请记住,如果您没有可能为IIS安装URL重写模块,则无法使用它。检查下一篇文章以获取详细信息。文章有点过时,如果您像我一样使用IIS 10,则需要在此处获取URL重写模块。
因此,首先您必须安装此模块。之后,将此部分添加到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>
仅此而已。现在几乎与星号的任何畸形URL都可以使用而不会出现此烦人的错误。
为什么几乎?因为如果危险符号以iis虚拟目录的名义出现。
,您仍然会得到异常。因此,这两种方式都处理错误,例如http://localhost/webapplication1/api*/values
和这两种方式都以URL失败,例如http://localhost/webapplication1*/api/values
只需在web.config
下从请求pathinvalidcharacter中删除星号...
<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,:,,?" />
...