在Django模板中切换javascript调试

时间:2018-04-13 03:11:42

标签: javascript django debugging

我正在研究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调试?

1 个答案:

答案 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),并且你可以在启动时获得温和的性能提升。