【问题标题】:Delay Django HttpResponse for a particular request延迟特定请求的 Django HttpResponse
【发布时间】:2013-03-25 19:53:58
【问题描述】:

我正在为暴力登录尝试编写一个简单的解决方案。如果有很多失败的尝试,我需要在发送响应之前添加延迟。你们建议为个人请求增加延迟是什么?它必须是每个请求,以便为特定资源提供服务的线程不应该受到下一个请求的影响。

谢谢。

编辑: 根据this question 在Apache 上运行时Webfaction time.sleep 会延迟对同一资源的下一次请求。

那么在这种情况下,什么可以替代 time.sleep 呢?

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您在线程服务器中延迟响应,您的服务将容易受到 DOS 攻击。攻击者可能会一次发送可能的请求,并且你的所有线程都会立即休眠......

    如果来自同一 IP 的尝试次数过多,您最好询问 CAPTCHA。

    更新:我会使用 Twisted( 或 Tornado,但我从未使用过)和 nginx(不是 Apache)作为前端。您甚至可以同时使用 Twisted 和 Django,但是您必须编写代码来模仿 Django 身份验证和会话与 Twisted,将正确的数据写入数据库。

    【讨论】:

    • 是的,这是真的。因此,我试图找出是否可以在不影响对同一资源的后续请求的情况下使此延迟异步。
    • 我相信你用 Django 做不到 :(
    • 我明白了。是否有任何框架或工具可以帮助实现非阻塞延迟?
    • 我会使用 Twisted 和 nginx(不是 Apache)作为前端。你甚至可以同时使用 Twisted 和 Django,但是你必须编写代码来模仿 Django 的身份验证和会话与 Twisted,将适当的数据写入数据库。
    • 您能否将此添加到您的答案中?我也会对此表示赞同。
    【解决方案2】:

    如果我错了,请拒绝我,但我认为每个线程一次只处理一个请求。因此,如果您想要一个缓慢的请求,只需在该线程中执行time.sleep,服务器将需要更长的时间来处理它,而不会影响其他并发请求。

    【讨论】:

    • 我知道这取决于网络服务器?
    • @maulik13:那你用的是什么服务器?
    • 目前我在 Django 的开发服务器上。我还没有决定生产网络服务器。
    • @maulik13:django 的开发服务器一次只处理一个请求。你是对的,它取决于服务器。如果您有一个异步服务器,那么它将有一种特殊的方式来延迟请求。如果您有一个线程同步服务器,那么我写的内容是准确的,也许您可​​以找到一种方法将另一个线程添加到线程池中,而当前线程什么都不做。
    • 你是对的,每个请求只有一个线程,这对于基于文档的 Django 开发服务器来说是正确的。
    【解决方案3】:

    Http 是一种无状态协议。连接请求的唯一方法是将会话信息存储在客户端的某处。由于您无法控制客户端行为,因此最好的机会是在服务器端记录失败的登录尝试并延迟这些帐户的登录例程。

    【讨论】:

    • 我不是在寻找用户的链接状态到延迟。我已经知道要响应哪个 IP 和用户。我正在寻找一种在不阻止其他请求的情况下为单个请求添加此延迟的方法。
    • 这就是我所说的。顺便说一句,依靠 IP 不是一个好主意,您可能会阻止人们使用共享 IP...
    • 我知道风险。但这仅用于登录。而且只有几秒(可能是 2-5)秒的延迟。
    • 当用户名已知并且该用户注册了许多失败尝试时,这尤其有用。在这种情况下,它只是检查是否尝试了特定的用户名,然后为该响应添加延迟。
    • @maulik13:一个更简单的解决方案可能是在数据库中记录最后几次登录尝试,如果登录次数过多,则返回一条消息,如“访问被拒绝:登录尝试次数过多。再试一次几秒钟。”那么你不必在服务器端延迟,但你也不要让这个人有效地暴力破解。
    猜你喜欢
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2017-08-12
    • 2021-01-08
    • 2013-11-17
    • 2019-04-14
    相关资源
    最近更新 更多