我有这个控制器。
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>
这些配置对目录中的文件没有影响。
有谁知道如何解决这个问题?
答案 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="<,>,*,%,&,:,\,?" />
...