C XSS漏洞解决 凌晨两点,漏洞监控弹出一条告警。解决攻击载荷是漏洞``,但奇怪的解决是,它被原样存进了数据库,漏洞又原样吐在了页面上——连HTML实体都没转。解决我盯着那条日志看了半分钟,漏洞确认这不是解决反射型,是漏洞存储型XSS,而且就藏在最不起眼的解决评论框里。 这类漏洞的漏洞麻烦在于,它不像SQL注入那样有明确的解决语法错误可循。C语言的漏洞XSS问题,本质上不是解决语言缺陷,是漏洞开发者把用户输入当成了可信数据。你写`printf("%s", user_input)`,浏览器就把它当HTML解析。就这么简单,也这么致命。 解决思路分三层。第一层是输出编码,也是最直接的。在C代码里,凡是把字符串拼进HTML响应的地方,都得过一道转义函数。`<`变`<`,`>`变`>`,引号变`"`。别嫌麻烦,写个`html_escape()`函数,所有输出走它。我见过不少项目图省事,只在某几个接口做了转义,结果漏了搜索框旁边的“相关推荐”模块,照样被打穿。 第二层是输入校验。但这里有个反直觉的点——不是过滤“坏”字符,而是白名单放行“好”字符。评论内容允许中文、英文、数字、标点,那正则就只匹配这些。其他字符一律拒绝或者转成Unicode安全形式。攻击者用`\u003c`绕过黑名单?白名单直接不认这玩意儿。你不需要理解所有攻击手法,只需要定义什么是合法的。 第三层,也是最容易被忽略的——响应头设置。在C语言的HTTP响应里,主动加`Content-Security-Policy: default-src 'self'`。这招能挡住大部分内联脚本注入。就算攻击者成功让` |