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

C#中跨站脚本(XSS)防护方案咨询——正则过滤无效的问题解决

C#中跨站脚本(XSS)防护方案咨询——正则过滤无效的问题解决

兄弟,我太懂你这种用正则过滤了半天,结果代码扫描还是报XSS风险的郁闷!其实问题大概率不是你的正则写得不好,而是XSS防护的核心逻辑不能只靠输入过滤——得结合你这个productCodeClean最终的使用场景来针对性处理,给你几个实用的解决方案:


1. 先搞清楚:你的数据最终要去哪里?

XSS的风险本质是恶意内容被当成可执行代码(HTML/JS等)解析,所以防护的关键是在输出环节做对应场景的编码,而不是只在输入时过滤:

  • 如果要输出到HTML页面:用.NET自带的编码工具把特殊字符转成HTML实体,彻底避免被浏览器解析成标签:
    // .NET Framework用HttpUtility,.NET Core/.NET 5+用WebUtility更通用
    string safeForHtml = WebUtility.HtmlEncode(productCodeClean);
    // 之后再把safeForHtml输出到页面
    
  • 如果要嵌入到JavaScript代码中:用专门的JS编码方法,防止被当成JS语句执行:
    string safeForJs = HttpUtility.JavaScriptStringEncode(productCodeClean);
    
  • 如果只是存入数据库:其实输入过滤不是必须的,只要后续输出时做好编码就安全;但如果要提前拦截非法格式,建议用格式校验而非替换(往下看)。

2. 优化你的输入处理:从“替换非法字符”改成“校验合法格式”

你当前的正则是把非法字符替换为空,但这种方式可能留下意想不到的风险片段(比如恶意内容被截断后仍能触发XSS)。更稳妥的做法是直接校验输入是否符合产品编码的合法格式,不符合就拒绝:

// 假设你的产品编码只能是字母、数字、下划线、连字符,有空格就把空格加进正则里
var validProductCodePattern = @"^[0-9A-Za-z_-]+$";
if (!Regex.IsMatch(Row.Cells[5].Text, validProductCodePattern))
{
    // 这里可以抛出异常、跳过这条数据,或者给用户提示非法输入
    throw new ArgumentException("产品编码格式非法,请输入合法的编码");
}
// 校验通过后再赋值,不需要替换
string productCodeClean = Row.Cells[5].Text;

3. 用官方成熟库替代自己写正则

如果是ASP.NET项目,直接用微软官方的Microsoft.Security.Application.AntiXss库(以前叫AntiXssLibrary),它内置了经过验证的XSS防护逻辑,比自己写正则靠谱太多:

using Microsoft.Security.Application;

// 针对HTML场景的安全编码
string safeHtml = AntiXss.HtmlEncode(productCodeClean);
// 针对URL场景的编码
string safeUrl = AntiXss.UrlEncode(productCodeClean);

最后再划个重点

代码扫描工具报XSS风险,90%的情况是因为它检测到你可能会把未编码的内容输出到前端,而不是输入过滤的问题。所以优先检查你的输出环节有没有做对应场景的编码,再配合输入校验,就能彻底解决问题啦!

备注:内容来源于stack exchange,提问作者Lia Lucindia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:17:43