【问题标题】:py.warning: Just one line, but stacktrace needed for debuggingpy.warning:只有一行,但调试需要堆栈跟踪
【发布时间】:2017-07-12 10:49:40
【问题描述】:

我在日志中看到此警告:

py.warnings._decompression_bomb_check +2261:警告 [1091] /usr/lib64/python2.7/site-packages/PIL/Image.py:2261:DecompressionBombWarning:图像大小(139332960 像素)超过 89478485 像素的限制,可能是解压弹DOS攻击。

不幸的是,仅此行并不能帮助我进行调试。

我想查看堆栈跟踪和其他数据,例如请求 URL。

我们使用 Django 1.8 和 Python 2.7

上述警告发生在生产系统上。大约每周一次。

我不知道如何重现它,因为我不知道产生警告的 URL。

更新

警告很明确。但我不知道巨大的图像存储在哪里。我正在搜索大文件的文件名或产生此警告的 URL。

我认为找到的唯一方法是:在生产环境中添加一些调试行并等待几天,直到再次产生警告。

【问题讨论】:

  • 你期待什么,警告几乎是明确的?
  • 警告很明确。是的,你是对的。我的问题:哪个 URL 访问数据?我想调试它以找到巨大的图像。警告中的文件路径是 python 文件的路径。我的问题:哪个 URL 会产生此错误。我更新了问题以使这一点更清楚。
  • 进一步的可能:如果日志条目有时间戳,则将时间戳与连接日志匹配以获取URL。
  • @stovfl 是的,这种类型的猜测可能会有所帮助......“歧义”我不记得 Python 的 Zen 说了什么。你呢?

标签: python django logging python-imaging-library


【解决方案1】:

在我看来,可持续地做到这一点的最佳方法是使用django-debug-toolbar。它为您提供非常详细的日志、请求详细信息、触发的 SQL 以及应用程序的每个 URL 上没有的内容。安装过程也是pretty trivial。试一试,看看你喜不喜欢!

如果您确实绝对需要手动执行此操作,我建议您定义自己的中间件来执行此操作。像

class CustomErrorHandlingMiddleware(self):
    def process_exception(self, request, exception):
        # Handle exceptions here
        # Log to file or console as necessary
        return HttpResponse(...) 

来自 Django 文档,

当视图引发异常时,Django 调用 process_exception()。 process_exception() 应该返回 None 或 HttpResponse 对象。如果它返回一个 HttpResponse 对象,则将应用模板响应和响应中间件,并将结果响应返回给浏览器。否则,将启动默认异常处理。

【讨论】:

  • 抱歉,我的问题遗漏了一些内容。我更新了问题“以上警告发生在生产系统上,我不知道如何重现它,因为我不知道产生警告的 URL。”这意味着 django-debug-toolbar(这是一个很棒的工具)在这里没有帮助。
【解决方案2】:

记录文件名的建议

复制 /usr/lib64/python2.7/site-packages/PIL/Image.py
打开此文件并编辑以下内容:

def _open_core(fp, filename, prefix):
    # ...
    _decompression_bomb_check(im.size)

改为:

    _decompression_bomb_check(im.size, filename)

以及以下内容:

def _decompression_bomb_check(size):
    # ...

    if pixels > MAX_IMAGE_PIXELS:
        warnings.warn(

到:

def _decompression_bomb_check(size, filename):
    # ...

    if pixels > MAX_IMAGE_PIXELS:
        warnings.warn(
            "Filename: %s"
            "Image size (%d pixels) exceeds limit of %d pixels, "
            "could be decompression bomb DOS attack." %
            (filename, pixels, MAX_IMAGE_PIXELS),
            DecompressionBombWarning)

在 Internet 上搜索DecompressionBomb 图片示例
测试您使用此示例对Image.py 进行的编辑。
如果日志记录满足您的需求,请备份 Original Image.py 并将其替换为编辑文件。 然后也测试您的生产系统。

【讨论】:

  • 好的,这行得通。我想避免更改生产服务器上的上游源代码。但是这个答案绝对解决了这个问题。谢谢。
  • @aryamccarthy 我使用了左侧的复选标记,因为我发现右侧没有复选标记:-) .. 谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 2016-02-19
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多