我正在使用SonarQube对JavaScript代码进行代码分析。分析是抱怨这行代码:
if (this.isDebug) {
console.log("[DEBUG: " + message);
}
收到此消息:
不应使用控制台日志记录。
调试语句总是很有用 在开发期间。但是将它们包含在生产代码中 - 特别是 在运行客户端的代码中 - 您冒着无意中冒险的风险 暴露敏感信息,减慢浏览器速度,甚至 为某些用户错误地删除网站。
现在,如果我将console.log
更改为console.info
,我就没有先前的警告。但是,根据我的理解,log
和info
是等效的。
info
是否是正确的解决方法?答案 0 :(得分:1)
代码分析工具希望产生大量输出,因此您感觉自己从使用它们中获得了金钱的价值。您仍然需要将自己的常识应用于他们的建议。
他们真正警告你的是,知道如何打开控制台的最终用户将能够看到你登录到控制台的任何内容。他们可能没有为console.info
添加相同的警告而烦恼,因为console.info
相对未被充分利用(但是,正如您所指出的,它在功能上等同于console.log
。)
警告中有事实和虚构的混合物:
您冒着无意中暴露敏感信息的风险
那部分是真的。 (对于"敏感"的某些值,严格来说,假设代码在客户端运行,控制台上记录的任何信息也可以通过挖掘代码提供给最终用户,但它是一个sa。阅读控制台更简单。如果代码不是运行客户端,那么无论你是否打电话给console.log
都没有区别。)
减慢浏览器的速度,
技术上是正确的,但在大多数现实世界中并非十分相关。如果您记录大量数据和大量数据,浏览器确实需要花时间将数据打印到控制台中(尽管我认为这只是控制台当时打开的情况。)这需要在此之前进行相当多的记录会产生明显的影响。
甚至为某些用户错误输出网站。
我会继续把这部分称为废话:我不知道任何浏览器如此脆弱,只是简单地调用console.log
会导致错误。
使用信息会是正确的解决方法吗?
如果您关心的只是让警告消失,请务必使用.info()
;除了让警告消失之外,它不会解决任何问题,但根据您的记录情况,首先可能没有问题需要解决。
解决此安全问题的最佳方法是什么?
理想情况下,构建管道可以删除控制台消息,因此您不必记住自己删除它们;这可以区分开发环境和生产环境,因此您不必使用this.isDebug
等标记进行编码。
如果不这样做,请检查您的代码,以确保您没有记录任何可能被视为敏感的内容。在您的情况下,由于日志调用包含在调试标志中,因此您需要确保在生产环境中this.isDebug
永远不会设置为true。