JavaScript代码跨站脚本(XSS)漏洞检测及修复方案咨询
跨站脚本(XSS)漏洞修复方案
问题说明
你的Node.js代码存在XSS漏洞:不可信数据源req.body中的userName未经过滤,直接拼接后通过res.send返回给客户端,攻击者可构造恶意userName内容控制响应输出,触发XSS攻击;同时日志写入操作中也存在同样的未处理风险。
具体修复方案
1. 对不可信数据做HTML转义
将userName中的HTML特殊字符(如<、>、"、'、&)转义为HTML实体,确保浏览器将恶意内容解析为普通文本。
方式一:手动实现转义函数
function escapeHtml(str) { return str.replace(/[&<>"']/g, char => { const entities = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return entities[char] || char; }); } // 修复后的响应代码 return res.status(helper.statusCode.OK).send({ message: `${escapeHtml(userName)} ${helper.statusMessage.NO_SCHEDULE_DATA}` });
方式二:使用成熟第三方库
先安装依赖:
npm install escape-html
再在代码中引入使用:
const escapeHtml = require('escape-html'); // 修复后的响应代码 return res.status(helper.statusCode.OK).send({ message: `${escapeHtml(userName)} ${helper.statusMessage.NO_SCHEDULE_DATA}` });
2. 输入内容白名单验证
从源头限制userName的合法字符,只允许字母、数字、下划线等安全字符,拒绝非法输入:
// 定义合法用户名的正则规则 const validUserName = /^[a-zA-Z0-9_]+$/; if (!validUserName.test(userName)) { return res.status(helper.statusCode.BAD_REQUEST).send({ message: '用户名格式非法' }); } // 验证通过后再返回响应 return res.status(helper.statusCode.OK).send({ message: `${userName} ${helper.statusMessage.NO_SCHEDULE_DATA}` });
3. 修复日志写入的安全问题
日志中的userName和initialDate同样需要转义,避免日志注入风险:
util.errorLoging({ message: `${escapeHtml(userName)} ${helper.statusMessage.NO_SCHEDULE.DATA} ${escapeHtml(initialDate)}`, bqJobId: bqJobId, userName: escapeHtml(userName) });
内容的提问来源于stack exchange,提问作者Jaango Jayaraj
相关产品推荐
相关产品推荐

