彻底解决“从客户端中检测到有潜在危险的Request.Form值”

本文介绍了一种前后端配合解决HTML特殊字符导致验证失败的方法。前端使用自定义encodeHtml函数对输入进行编码,后端使用对应的DecodeHtml方法解码,确保数据正确传递并展示。同时提供了解码过程中保持样式完整的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    类似设置validateRequest="false"的方法不推荐,因为应用程序需要显式检查所有输入,不方便。

    1、前端使用encodeHtml函数对字符串进行编码,例:

var editor = $("textarea[name='editorValue']");
$("#contents").val(encodeHtml(editor.val()));
var formData = new FormData($("#frm")[0]);

    2、后端使用HtmlUtil.DecodeHtml方法进行解码,例:

model.contents = HtmlUtil.DecodeHtml(model.contents);

    3、View页面展示在编辑器中,例:

ue.addListener('ready', function (editor) {
    var contents = decodeHtml("@content.contents");
    ue.setContent(contents);
});
 JS方法decodeHtml代码:
function encodeHtml(val) {
    return val.replace(/&/g, "&")
              .replace(/</g, "&lt;")
              .replace(/>/g, "&gt;");
}

function decodeHtml(val) {
    return val.replace(/&amp;/g, "&")
              .replace(/&lt;/g, "<")
              .replace(/&gt;/g, ">")
              .replace(/&#039;/g, "'")
              .replace(/&quot;/g, "\"");
}

    说明:上面的encodeHtml和decodeHtml方法有点绕人,因为这两个方法不对称,encodeHtml方法少了.replace(/'/g, "&#039;").replace(/\"/g, "&quot;")。编码的目的,是为了绕过验证,而导致验证不通过的原因是因为某些html标签,也就是说当字符串中含有<、>、&#039;之类的标识时,就会验证不通过,所以只需把&、<、>这三个替换掉就可以了。如果加上.replace(/'/g, "&#039;").replace(/\"/g, "&quot;"),则又会导致出现$#039;从而导致验证不通过,所以encodeHtml方法只替换3个。但解码多替换了两个,这是必需的,否则<span style="font-size:20px;"></span>在百度编辑器中显示会变成<span></span>从而造成style样式的丢失。

    HtmlUtil.DecodeHtml方法代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Common.Utils
{
    /// <summary>
    /// HTML工具类
    /// </summary>
    public class HtmlUtil
    {
        #region html编码
        /// <summary>
        /// html编码
        /// </summary>
        public static string EncodeHtml(string html)
        {
            return html.Replace("&", "&amp;")
                       .Replace("<", "&lt;")
                       .Replace(">", "&gt;")
                       .Replace("'", "&#039;")
                       .Replace("\"", "&quot;");
        }
        #endregion

        #region html解码
        /// <summary>
        /// html解码
        /// </summary>
        public static string DecodeHtml(string html)
        {
            return html.Replace("&amp;", "&")
                       .Replace("&lt;", "<")
                       .Replace("&gt;", ">")
                       .Replace("&#039;", "'")
                       .Replace("&quot;", "\"");
        }
        #endregion

    }
}
View Code

 



转载于:https://www.cnblogs.com/s0611163/p/5542753.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值