{ "info": { "author": "orsinium", "author_email": "master_fess@mail.ru", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Plugins", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Lesser General Public License v3 or later (LGPLv3+)", "Programming Language :: Python" ], "description": "DjBrut\n======\n\n.. figure:: logo.png\n :alt: DjBrut logo\n\n DjBrut logo\n\n|Build Status| |PyPI version| |Status| |Code size| |License|\n\nDjBrut -- simple brutforce protection for Django project.\n\nDefault checkers:\n\n- Max requests for IP.\n- Max requests for user.\n- Max requests for one CSRF-token (stupid but effective).\n- Max requests frequency limitation.\n\nDjBrut use Redis as storage for all counters.\n\nInstallation\n------------\n\n::\n\n pip install djbrut\n\nUsage\n-----\n\n.. code:: python\n\n from django.http import HttpResponse\n from djbrut import Attempt\n\n def some_view(request):\n attempt = Attempt('some rule type name', request)\n # check\n if not attempt.check():\n # error\n return HttpResponse(attempt.error)\n # success\n ...\n\nYou can see `example project `__ for more details.\n\nConfiguring\n-----------\n\nJust set up rules:\n\n.. code:: python\n\n BRUTEFORCE_LIMITS = {\n 'default': Rule(\n user=100, # max requests for one user by BRUTEFORCE_TIMELIMIT\n ip=300, # max requests for one IP by BRUTEFORCE_TIMELIMIT\n csrf=50, # max requests with one CSRF token by BRUTEFORCE_TIMELIMIT\n freq=0, # max request frequency for client [seconds]\n ),\n 'some rule type name': Rule(\n user=100, # max requests for one user by BRUTEFORCE_TIMELIMIT\n ip=300, # max requests for one IP by BRUTEFORCE_TIMELIMIT\n csrf=50, # max requests with one CSRF token by BRUTEFORCE_TIMELIMIT\n freq=0, # max request frequency for client [seconds]\n ),\n }\n\n``Attempt`` get rule type name as first arg. If rule type name not found\nin keys of BRUTEFORCE\\_LIMITS, 'default' will be used. If you don't set\ndefault rule then passed rule type must be exists in BRUTEFORCE\\_LIMITS\nkeys.\n\n``BRUTEFORCE_TIMELIMIT`` -- time to live for all attempts counters.\n\nYou can see `default settings `__ for more\nparams such as custom error message.\n\n.. |Build Status| image:: https://travis-ci.org/orsinium/django-bruteforce-protection.svg?branch=master\n :target: https://travis-ci.org/orsinium/django-bruteforce-protection\n.. |PyPI version| image:: https://img.shields.io/pypi/v/djbrut.svg\n :target: https://pypi.python.org/pypi/djbrut\n.. |Status| image:: https://img.shields.io/pypi/status/djbrut.svg\n :target: https://pypi.python.org/pypi/djbrut\n.. |Code size| image:: https://img.shields.io/github/languages/code-size/orsinium/django-bruteforce-protection.svg\n :target: https://github.com/orsinium/django-bruteforce-protection\n.. |License| image:: https://img.shields.io/pypi/l/djbrut.svg\n :target: LICENSE", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/orsinium/django-bruteforce-protection/tarball/master", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/orsinium/django-bruteforce-protection", "keywords": "djbrut django bruteforce protection security redis", "license": "GNU Lesser General Public License v3.0", "maintainer": "", "maintainer_email": "", "name": "djbrut", "package_url": "https://pypi.org/project/djbrut/", "platform": "", "project_url": "https://pypi.org/project/djbrut/", "project_urls": { "Download": "https://github.com/orsinium/django-bruteforce-protection/tarball/master", "Homepage": "https://github.com/orsinium/django-bruteforce-protection" }, "release_url": "https://pypi.org/project/djbrut/1.0.0/", "requires_dist": null, "requires_python": "", "summary": "Framework for views in big projects on Django.", "version": "1.0.0" }, "last_serial": 3736933, "releases": { "0.8.0": [ { "comment_text": "", "digests": { "md5": "5573fd67c02b7020fed623adf026f597", "sha256": "b6db7523bd63f918c01759a47044930292441a1978b804ada8aed3190ab50a82" }, "downloads": -1, "filename": "djbrut-0.8.0.tar.gz", "has_sig": false, "md5_digest": "5573fd67c02b7020fed623adf026f597", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6216, "upload_time": "2018-03-06T08:11:23", "url": "https://files.pythonhosted.org/packages/67/75/be0e948b00bc25bfe9a1174940c855f7a10c89aed411986a92f795c2f5be/djbrut-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "bcc39f36df2a215d237185faeddd6ac1", "sha256": "2ec6ca5f82d586e904142307037e02aecf76555b26e9846376ff73175412795a" }, "downloads": -1, "filename": "djbrut-0.8.1.tar.gz", "has_sig": false, "md5_digest": "bcc39f36df2a215d237185faeddd6ac1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7139, "upload_time": "2018-03-06T08:39:41", "url": "https://files.pythonhosted.org/packages/6d/8c/df017c23eae64535d92a8d8ab3ed06ae6800fec42fb3b4313c569ad0591e/djbrut-0.8.1.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "da6d8ac05e4c88722e961df324f717da", "sha256": "b9dafe927e75b1718f0794d16212bde49b8e457d81c04adc8b6641218589208b" }, "downloads": -1, "filename": "djbrut-1.0.0.tar.gz", "has_sig": false, "md5_digest": "da6d8ac05e4c88722e961df324f717da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7706, "upload_time": "2018-04-05T10:22:00", "url": "https://files.pythonhosted.org/packages/76/ba/f910e67250984909d7cc9dd5c501514ba66443d02ab5564e9b9137e8e4e0/djbrut-1.0.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "da6d8ac05e4c88722e961df324f717da", "sha256": "b9dafe927e75b1718f0794d16212bde49b8e457d81c04adc8b6641218589208b" }, "downloads": -1, "filename": "djbrut-1.0.0.tar.gz", "has_sig": false, "md5_digest": "da6d8ac05e4c88722e961df324f717da", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7706, "upload_time": "2018-04-05T10:22:00", "url": "https://files.pythonhosted.org/packages/76/ba/f910e67250984909d7cc9dd5c501514ba66443d02ab5564e9b9137e8e4e0/djbrut-1.0.0.tar.gz" } ] }