瑞典语字符在 Ajax 调用中给出潜在危险的 request.form 值错误

Posted

技术标签:

【中文标题】瑞典语字符在 Ajax 调用中给出潜在危险的 request.form 值错误【英文标题】:Swedish characters giving potentially dangerous request.form value error on Ajax call 【发布时间】:2013-10-16 19:49:45 【问题描述】:

在我看来,我正在从 Ajax 调用控制器函数

$.ajax(
    type: "POST",
    url: "@Url.Action("GetSelectedItemsForRoleId","User")",
    data:  optionLabel: '@CommonResource.DropdownNoValueText', optionValue: null, selectedValue: null, filterValue: 0 ,
    success: function (result) 
        alert('success');
        var departmentDropdown = $('#RoleId').data("DropDownList");
        departmentDropdown.setDataSource(result);
    ,
    error: function(XMLHttpRequest, textStatus, errorThrown)
    
        alert('XMLHttpRequest ' + XMLHttpRequest);
        alert('textStatus ' + textStatus);
        alert('errorThrown ' + errorThrown);
        //some stuff on failure
    ,
    dataType: "json",
    traditional: true,
    async: false
);  

CommonResource.DropdownNoValueText-Välj-

我在失败块中收到以下错误:

从客户端检测到潜在危险的 request.form 值

我的控制器签名如下所示:

public ActionResult GetSelectedItemsForRoleId(string optionLabel, string optionValue, string selectedValue, int filterValue)  

我试图把ValidateInput注解放在这个函数上面,并将它设置为false。 之后,字符串显示为-Välj-。 这是什么原因,我怎样才能得到原始文本,即-Välj-

更新: 我进一步尝试了两件事:

    我直接用-Välj-替换了@CommonResource.DropdownNoValueText。现在我没有收到任何错误。(但这不是正确的解决方案,因为这不会解决语言功能)。 我将 CommonResource 中的 DropdownNoValueText 替换为 eee 之类的其他内容,它也不会出错。(但这也不是解决方案)。

【问题讨论】:

相关,可能重复***.com/questions/81991/… 这是因为 ModelBinder 在 XSS 尝试中遇到了一些它认为是敌对的字符,通常是 <> 我猜这个问题是因为 ä 字符。 @Tomalak :我不能将 validateFalse 放在 Pages 中,因为它会导致输入数据不正确或有害。我只在下拉列表中应用它,并且这个字符串值是硬编码的。 请看我更新的问题。 【参考方案1】:

我在使用瑞典语和西班牙语字符时遇到了类似的问题。 我们使用了HttpUtility.javascriptStringEncode方法,它对字符串中的字符进行编码,并导致 & 后跟哈希符号:

puntuación   

这反过来又引起了 .NET 的安全反应(返回错误)。

解决方案是将 htmlUtility 类使用的默认编码器更改为不使用默认编码器 (HtmlEncoder),而是使用 AntiXssEncoder,它不会对特殊的瑞典语或西班牙语字符等字符进行编码,因为它们是无害的(不能用于 XSS 攻击)。

此后,瑞典语/西班牙语字符不被编码,因此&# 字符串也被避免,因此避免了 .NET 的安全反应(错误)。 此更改在配置文件中,可能具有全局影响:

<httpRuntime encoderType="System.Web.Security.AntiXss.AntiXssEncoder"/>

只是为了添加一些关于避免情况原因的信息 - 解决此问题的失败尝试是使用 HttpUtility.HtmlEncode 而不是 HttpUtility.JavaScriptStringEncode 将字符串更改为:

puntuaci&amp;#243;n

因此使用&amp;amp; 代替&amp;#,这避免了问题但会导致其他不需要的副作用。

【讨论】:

对这个问题的进一步经验 - 俄语再次出现问题,因此使用.cshtml中的Server.HtmlEncode,并在控制器方法中使用Server.Html.Decode,以及[ValidateInput(false)]作为控制器的属性方法。

以上是关于瑞典语字符在 Ajax 调用中给出潜在危险的 request.form 值错误的主要内容,如果未能解决你的问题,请参考以下文章

处理“潜在危险的 Request.Form 值...”

从客户端中检测到有潜在危险值的解决办法

从客户端中检测到有潜在危险的 request.form值[解决方法]

从客户端中检测到有潜在危险的 Request.Form 值

MVC 4 - Razor - “从客户端检测到一个潜在危险的request.form值”

从客户端中检测到有潜在危险的 request.form值[解决方法]