通过AJAX传递HTML参数至C# MVC控制器动作时遇危险请求错误
嘿,这个问题我太熟了——ASP.NET自带的请求验证机制在拦着你呢!它默认会把QueryString里的HTML/XML内容当成潜在的XSS攻击风险,所以才抛出那个「A potentially dangerous Request.QueryString value」的错误。给你几个实用的解决方案:
解决方案1:改用POST请求(最推荐)
GET请求本来就不适合传递HTML这类长且包含特殊字符的内容,不仅容易触发安全验证,还有URL长度限制的问题。换成POST把参数放在请求体里就完美解决了:
前端AJAX代码修改:
// 先拿到富文本框的HTML内容 var varWithHTML = $('#yourRichTextBoxId').val(); $.ajax({ url: "ThisController/ThisAction", type: "POST", // 改成POST请求 cache: false, data: { Parameter: varWithHTML }, // 参数放在data里,不再拼URL success: function (data, status, jqxhr) { // 这里写你的成功回调逻辑 } });
后端Controller代码修改:
给对应的动作加上[HttpPost]特性,正常接收参数即可:
[HttpPost] public ActionResult ThisAction(string Parameter) { // 处理HTML参数的业务逻辑 return View(); }
解决方案2:如果必须用GET请求,调整验证规则
要是因为特殊场景一定要用GET,那可以针对性地关闭该参数的安全验证,但强烈建议只针对单个参数做修改,别全局关闭,不然会降低整个站点的安全性:
步骤1:给后端参数加上允许HTML的特性
在Controller的动作参数上标记[AllowHtml]:
public ActionResult ThisAction([AllowHtml] string Parameter) { // 处理逻辑 return View(); }
注意:如果你的项目是.NET 4.0及以上版本,默认的
requestValidationMode就是4.0,不需要额外改web.config;如果是旧版本,可能需要在web.config的<httpRuntime>节点里加requestValidationMode="2.0"。
步骤2:前端对HTML参数做URL编码
拼URL的时候一定要用encodeURIComponent()对HTML内容编码,避免特殊字符破坏URL格式:
var sourceURL = "ThisController/ThisAction?Parameter=" + encodeURIComponent(varWithHTML); $.ajax({ url: sourceURL, type: "GET", cache: false, success: function (data, status, jqxhr) { // 回调逻辑 } });
重要提醒:别忘做XSS防护
不管用哪种方法,都要自己对用户输入的HTML做安全清理!ASP.NET的请求验证是第一道防线,关掉之后你得自己用工具(比如Microsoft AntiXSS库)过滤掉恶意脚本,防止XSS攻击。
内容的提问来源于stack exchange,提问作者CJH
相关产品推荐
相关产品推荐

