HTML转义与反转义方法:jQuery QueryBuilder搜索小于号返回空处理
jQuery QueryBuilder 查询空结果的后端转义修复方案
问题根因
数据流转过程中产生双重HTML转义:原始内容中的<字符,第一次转义后为合规的<,后续经过序列化/输出环节被二次转义为&lt;。
前端QueryBuilder执行等值匹配时,用户输入的< something会被浏览器处理为单次转义的< 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
相关产品推荐
相关产品推荐

