我正在研究Django项目的javascript方面,我的javascript函数会将一些文本输出到控制台,以便我可以更轻松地进行调试。我的javascript文件如下所示:
(function(nameSpace, $, undefined ) {
var debug = true;
nameSpace.foo = function() {
if (debug) {
console.log('foo was there')
}
};
}(window.nameSpace = window.nameSpace || {}, jQuery ));
我认为最好在生产中关闭此输出,但我不想更改每个javascript文件。所以我想我会创建一个context_processor
来将settings.DEBUG
的值传递给我的基本模板。
现在我的base.html:
<html>
<head>
...
<script> var window.debug = {{ DEBUG }}; </script>
</head>
...
</html>
我的javascript文件有var debug = window.debug
而不是硬编码的布尔值。
回过头来看,我想知道这是否安全。我认为有人可以使用window.debug
变量轻松调节,只要控制台输出不会泄漏安全信息,例如csrf
令牌,这就很好。我不是安全专家,但我觉得这里有点滑。
我目前的想法是否安全?如果不是,我怎么能更安全地为整个项目切换javascript调试?
答案 0 :(得分:1)
你现在的想法是安全的,如果有点尴尬,也许是草率的。泄漏CSRF令牌或其他控制台本身并不是问题,因为以编程方式访问控制台历史记录的唯一方法是在执行console.log
和系列之前保存它(或者已经接收到恶意JS你的页面 - 无论如何你都被冲洗了。无法从控制台复制是由浏览器强制执行的,否则它将成为一个巨大的攻击媒介(整体而言,我们的编码员马虎!)。
客户端调试变量的另一种可能更清晰的选择可能是完全兼容控制台。*功能。考虑:
{% if not DEBUG %}
<script>
window.console = (function(){
var c = {}; c.log = c.warn = c.debug = c.info = c.error = c.time = c.dir = c.profile = c.clear = c.exception = c.trace = c.assert = function(s){};
return c;
})();
</script>
{% endif %}
换句话说,只需将console.log()
电话留在那里即可。同时,在DEBUG的情况下,完全省略上述内容,可以获得调试信息。
请注意,这一点并不简单,因为&#34;正确行事&#34;意味着在非DEBUG情况下根本没有那些仪器调用,但只是在所有呼叫站点都不需要额外的JS hoopla。同时,JIT将智能地完全删除所有这些函数调用(因为它们现在是NOOP),并且你可以在启动时获得温和的性能提升。