瑞典语字符在 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&#243;n
因此使用&amp;
代替&#
,这避免了问题但会导致其他不需要的副作用。
【讨论】:
对这个问题的进一步经验 - 俄语再次出现问题,因此使用.cshtml
中的Server.HtmlEncode
,并在控制器方法中使用Server.Html.Decode
,以及[ValidateInput(false)]
作为控制器的属性方法。以上是关于瑞典语字符在 Ajax 调用中给出潜在危险的 request.form 值错误的主要内容,如果未能解决你的问题,请参考以下文章
从客户端中检测到有潜在危险的 request.form值[解决方法]