Checkmarx检测到客户端不安全存储敏感个人数据的技术问询
嘿,咱们来搞定这个Checkmarx抛出的「客户端不安全存储敏感个人数据」的安全告警。从你贴的代码片段来看,目前展示的是发起HTTP请求并添加认证头的逻辑,但告警的核心问题应该是你的应用把敏感信息(比如认证令牌、用户个人身份数据)存在了客户端的不安全位置,比如localStorage、未加密Cookie这类容易被XSS攻击窃取的地方,才触发了检测。下面是针对性的技术解决方案和整改建议:
一、核心整改:替换不安全的客户端存储方式
改用HttpOnly + Secure + SameSite的Cookie存储认证令牌
如果告警涉及的是认证类令牌(比如JWT),绝对不要把它存在localStorage/sessionStorage里,直接改成服务端设置安全Cookie的方式:// 示例:在服务端生成并设置安全Cookie var authCookie = new HttpCookie("AuthToken", generatedJwtToken) { HttpOnly = true, // 禁止前端JS读取,从根源防XSS窃取 Secure = true, // 仅允许HTTPS传输,避免明文泄露 SameSite = SameSiteMode.Strict, // 防止CSRF攻击 Expires = DateTime.UtcNow.AddHours(1) // 设置合理的过期时间,降低泄露风险 }; Response.Cookies.Add(authCookie);这样客户端发起请求时会自动携带该Cookie,完全不需要前端代码手动读取存储的令牌,彻底规避敏感数据暴露给前端环境的风险。
绝对禁止在客户端存储明文敏感个人数据
如果是用户手机号、身份证号、银行卡号这类核心敏感数据,绝对不要在客户端任何存储介质里留存!需要展示或使用时,直接从服务端接口按需获取,用完后立即清理前端内存中的数据,不要做持久化存储。
二、补充防护:增强数据传输与使用的安全性
对必须临时存储的敏感数据加密处理
万不得已需要在前端临时存储少量敏感数据(比如未提交的表单草稿),一定要用AES-256这类强对称加密算法加密后再存储,且加密密钥必须从服务端动态获取(绝对不能硬编码在前端代码中),同时密钥要定期轮换。配置CSP(内容安全策略)降低XSS风险
在服务端配置CSP响应头,限制前端脚本、资源的加载源,最大程度减少XSS攻击的可能性,就算出现漏洞也能降低敏感数据被窃取的概率:// 在你的HttpWebRequest或服务端全局配置中添加CSP头 httpWebRequest.Headers.Add("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self'");
三、代码层面的全面排查与优化
- 清理前端所有敏感数据存储逻辑
全局搜索前端代码中的localStorage.setItem、sessionStorage.setItem、document.cookie写入敏感数据的代码,全部移除或替换成上述安全方案。 - 验证认证流程的安全性
从你贴的代码看,是手动给请求添加Authorization头,要确认这个令牌的获取和流转过程:如果是前端从接口拿到令牌后存在了不安全的地方,那必须改成服务端设置HttpOnly Cookie的模式,让前端完全不接触令牌明文。
四、误判排查(如果确认无违规存储)
如果你确定应用没有在客户端存储敏感数据,可能是Checkmarx的误判:
- 检查代码中是否有注释掉的
localStorage/sessionStorage调用,哪怕是调试代码也可能被检测到; - 整理你的安全存储方案文档,提交给Checkmarx进行误判申诉,请求重新扫描验证。
内容的提问来源于stack exchange,提问作者user1103146

