【问题标题】:Conditional activation of Flask(Werkzeug) Debugger?Flask(Werkzeug)调试器的条件激活?
【发布时间】:2013-06-19 22:44:20
【问题描述】:

我即将部署一个 Flask 应用程序,由于内置调试器非常好,我想知道我是否可以在生产环境中使用它。

因此,我一直在寻找一种有条件的方法来激活该调试器,例如仅针对来自特定 IP 的请求,或仅针对在 cookie 中具有特殊密码的请求(或同时满足两个密码)。

我想没有内置的方法可以做到这一点,因此我很想知道我应该在哪里挖掘来破解它。也许可以通过猴子补丁 Flask 来做到这一点? 另外,如果这是一个坏主意,请告诉我原因。

【问题讨论】:

  • 我认为我低估了问题的严重性。生产环境(在我的情况下处于守护程序模式的 mod_wsgi)幸运的是有多个进程(线程),为了能够调试,我需要以某种方式解决 mod_wsgi 中的正确线程,如果不修改 mod_wsgi 源代码,这可能是不可能的...

标签: python debugging ip flask


【解决方案1】:

很可能通过破解 Werkzeug 的 DebuggedApplication 类来启用或禁用调试器(参见源代码 here)。

但这是一个糟糕的主意。这是一个生产系统,在你去调试你的问题的同时,会有真实的用户通过不同的线程或进程与应用程序交互。一些可能发生的事情:

  • Werkzeug 的调试器可能已在开发服务器内部进行了测试。在多进程或多线程服务器下使用时,它可能有效,也可能无效。
  • 在您调试问题时,会有真实用户在不同的进程或线程上与应用程序交互,可能会从您下面更改应用程序的状态,这可能会影响您的调试。
  • 在调试问题时,您可能会无意中更改应用程序的状态,从而影响当前使用该系统的其他用户。

【讨论】:

  • 是的,我同意这个东西很容易破坏东西,但是当回溯还不够时,我认为它是一种从回溯中获取一些状态变量的便捷方式。但是,如果小心使用,它可能是一种非常方便快捷的方式来找到有关您的问题的更多线索,而无需下载数据库来尝试在本地计算机上重现类似的环境。
  • 但是只有你会看到这个,所以任何遇到这个错误的随机用户都不会帮助你。所以你需要自己去重现这个错误,如果你必须做这个工作,你最好在一个专门的调试版本上做。你为什么要搞乱你的生产系统?
【解决方案2】:

正如@Miguel 指出的那样,这对于生产环境来说不是一个好主意,但是为了黑客攻击,这就是你可以做到的。

class CustomDebuggedApplication(DebuggedApplication):
    def __call__(self, environ, start_response):
        # Note, this line can check whatever you want.  A cookie, a query string param, a header.  But don't read the post form body.  If you do, it is gone and can't be used later.
        if not request.args.get('secret', False) == 'Foo' and not request.args.get('__debugger__', False):
            return self.app(environ, start_response)
        return super(CustomerDebuggedApplication).__call__(environ, start_response)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2014-02-21
    • 2012-07-19
    • 2012-04-02
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多