You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML转义与反转义方法:jQuery QueryBuilder搜索小于号返回空处理

jQuery QueryBuilder 查询空结果的后端转义修复方案

问题根因

数据流转过程中产生双重HTML转义:原始内容中的<字符,第一次转义后为合规的&lt;,后续经过序列化/输出环节被二次转义为&amp;lt;。
前端QueryBuilder执行等值匹配时,用户输入的< something会被浏览器处理为单次转义的&lt; something,与后端返回的双重转义内容永远无法匹配,最终查询返回空。

接口改动实现

基于现有ASP.NET MVC的GetJsonForQuery接口,无需引入第三方组件,直接利用框架自带的HttpUtility工具完成转义校准,具体改动如下:

  • 新增私有辅助方法,用于还原双重转义的内容,同时保留单次转义的安全输出状态
private string RestoreDoubleEscapedText(string rawText)
{
    if (string.IsNullOrWhiteSpace(rawText)) return rawText;
    // 对已转义内容做一次解码,消除双重转义的冗余
    var decodedText = HttpUtility.HtmlDecode(rawText);
    // 重新编码为单次转义的合规格式,匹配前端预期
    return HttpUtility.HtmlEncode(decodedText);
}
  • 在接口中插入转义处理逻辑,保留原有校验分支的逻辑不变
// GET: Search/GetJsonForQuery
public JsonResult GetJsonForQuery(ObjectJson serializedJson) {
    // 新增:入参转义预处理
    if (serializedJson?.Rules != null)
    {
        foreach (var rule in serializedJson.Rules)
        {
            if (rule?.Value != null)
            {
                // 将前端传入的双重转义查询值还原为用户实际输入的原始内容
                rule.Value = HttpUtility.HtmlDecode(rule.Value.ToString());
            }
        }
    }

    if (serializedJson.MainObjects == null) {
        JsonResult result = Json(new {
            updated = DateTime.UtcNow.ToString("o"),
            errorNoItemSelected = true
        },
        JsonRequestBehavior.AllowGet);

        result.MaxJsonLength = Int32.MaxValue;
        return result;
    }

    if (!IsColumnSelected(serializedJson)) {
        JsonResult result = Json(new {
            updated = DateTime.UtcNow.ToString("o"),
            errorNoColumnSelected = true
        },
        JsonRequestBehavior.AllowGet);

        result.MaxJsonLength = Int32.MaxValue;
        return result;
    }

    // 新增:返回结果组装环节,对所有包含HTML内容的字段调用RestoreDoubleEscapedText方法
    // 消除返回数据中的双重转义内容,保证和前端匹配规则的格式一致
    // 处理逻辑示例:
    // var matchedRecords = 数据库查询得到的匹配列表;
    // foreach (var record in matchedRecords)
    // {
    //     record.HtmlContentField = RestoreDoubleEscapedText(record.HtmlContentField);
    // }
}

注意事项

  • 处理双重转义时不要直接输出未编码的原始HTML内容,否则会引入XSS安全风险,必须保证最终返回的内容是单次HTML编码的状态
  • 不需要修改前端QueryBuilder的默认匹配逻辑,只要保证后端处理的入参格式、返回的内容格式和前端的匹配预期完全一致,即可解决输入< something时查询为空的问题

内容的提问来源于stack exchange,提问作者zine31

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 07:45:04