.NET Standard移除AllowHtmlAttribute后的替代方案咨询
解决方案
方案1:自定义跨框架兼容的AllowHtml特性(最推荐,无侵入适配双端)
- 第一步:在公共.NET Standard类库中定义空的自定义特性
/// <summary> /// 标记属性允许传入HTML内容 /// </summary> [AttributeUsage(AttributeTargets.Property)] public class AllowHtmlAttribute : Attribute { }
之后直接在需要放行HTML输入的实体属性上标记该特性即可。
- 第二步:适配.NET Framework WebForms端,自定义请求验证器识别该特性
在WebForms项目中新增自定义RequestValidator类:
public class CustomRequestValidator : RequestValidator { protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) { // 仅处理表单提交的参数 if (requestValidationSource == RequestValidationSource.Form) { // 简单场景可直接判断 collectionKey == "你需要放行的属性名" 即可快速生效,无需反射 // 复杂场景可反射获取对应模型属性,检查是否标记了自定义的AllowHtmlAttribute var isAllowHtml = // 按你的业务逻辑判断当前参数是否需要放行HTML if (isAllowHtml) { validationFailureIndex = 0; return true; } } // 其余场景走默认验证逻辑 return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); } }
在Web.config中注册自定义验证器,替换默认实现:
<system.web> <httpRuntime requestValidationType="YourWebFormsNamespace.CustomRequestValidator" /> </system.web>
- 第三步:适配.NET Core API端
.NET Core默认已移除全局请求HTML输入验证,不会触发类似WebForms的拦截错误,无需额外适配。如果业务需要做XSS防护,可在对应接口单独加校验逻辑即可。
方案2:针对WebForms单个页面/接口临时放行(适合少量场景快速修复)
如果需要放行的场景非常少,不需要改动公共类库,可直接在对应WebForms页面的Page指令中添加*ValidateRequest="false"*属性,仅关闭当前页面的全局输入验证,不影响全站其他功能:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="xxx.aspx.cs" Inherits="xxx" ValidateRequest="false" %>
注意:使用该方案时需要在当前页面的后台代码中手动对用户输入做XSS校验,避免安全风险。
安全提示
无论使用哪种方案,都建议在业务逻辑层对允许HTML输入的内容做白名单校验,仅允许<p>、<span>等安全标签,过滤<script>、<iframe>等危险标签,避免XSS攻击。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

