Django

Security rules for Django web framework

23
Security Rules

Run All Django Rules

pathfinder scan --ruleset python/django --project .

Rules

Django SQL Injection via cursor.execute()

CRITICAL

User input flows to cursor.execute() without parameterization, enabling SQL injection attacks.

pythondjangosql-injectioncursor-executedatabaseraw-sqltaint-analysisinter-proceduralCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Django SQL Injection via QuerySet.raw()

CRITICAL

User input flows to QuerySet.raw() without parameterization, enabling SQL injection through Django's ORM raw query interface.

pythondjangosql-injectionraw-querysetormtaint-analysisinter-proceduralCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Django SQL Injection via QuerySet.extra()

HIGH

User input flows to QuerySet.extra() without parameterization, enabling SQL injection through Django's legacy ORM extension interface.

pythondjangosql-injectionqueryset-extraormtaint-analysisinter-proceduralCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Django SQL Injection via RawSQL Expression

CRITICAL

User input flows to RawSQL() expression without parameterization, enabling SQL injection through Django's annotation system.

pythondjangosql-injectionrawsqlannotationsormtaint-analysisinter-proceduralCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Raw SQL Usage Audit via RawSQL Expression

MEDIUM

RawSQL() expression detected. Audit this usage to confirm parameterized queries are used for all user-controlled values.

pythondjangosql-injectionrawsqlauditormCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Django Tainted SQL String Construction

HIGH

User input is used to construct a SQL string that flows to a database execution function, enabling SQL injection via string building.

pythondjangosql-injectionstring-constructionf-stringformattaint-analysisinter-proceduralCWE-89OWASP-A03
CWE-89
Updated 2026-03-22

Django Command Injection via os.system()

CRITICAL

User input flows to os.system(), enabling arbitrary OS command execution with the privileges of the Django process.

pythondjangocommand-injectionos-systemshelltaint-analysisinter-proceduralCWE-78OWASP-A03
CWE-78
Updated 2026-03-22

Django Command Injection via subprocess

CRITICAL

User input flows to subprocess with shell=True or as a string command, enabling OS command injection.

pythondjangocommand-injectionsubprocessshelltaint-analysisinter-proceduralCWE-78OWASP-A03
CWE-78
Updated 2026-03-22

Django Code Injection via eval()

CRITICAL

User input flows to eval(), enabling arbitrary Python code execution on the server.

pythondjangocode-injectionevalrcetaint-analysisinter-proceduralCWE-95OWASP-A03
CWE-95
Updated 2026-03-22

Django Code Injection via exec()

CRITICAL

User input flows to exec(), enabling arbitrary Python statement execution on the server.

pythondjangocode-injectionexecrcetaint-analysisinter-proceduralCWE-95OWASP-A03
CWE-95
Updated 2026-03-22

Django globals() Misuse for Arbitrary Code Execution

HIGH

User input is used to index globals(), enabling arbitrary function dispatch and potential code execution.

pythondjangocode-injectionglobalsfunction-dispatchtaint-analysisinter-proceduralCWE-94OWASP-A03
CWE-94
Updated 2026-03-22

Django SSRF via requests Library

HIGH

User input flows to requests.get/post/put/delete/head(), enabling the server to make HTTP requests to attacker-controlled URLs.

pythondjangossrfrequestshttp-clienttaint-analysisinter-proceduralCWE-918OWASP-A10
CWE-918
Updated 2026-03-22

Django SSRF via urllib

HIGH

User input flows to urllib.request.urlopen() or urllib.request.Request(), enabling the server to make HTTP requests to attacker-controlled URLs.

pythondjangossrfurllibhttp-clientstandard-librarytaint-analysisinter-proceduralCWE-918OWASP-A10
CWE-918
Updated 2026-03-22

Django Path Traversal via os.path.join()

HIGH

User input flows to os.path.join() leading to file operations, enabling path traversal to access files outside the intended directory.

pythondjangopath-traversaldirectory-traversalos-path-joinfile-accesstaint-analysisinter-proceduralCWE-22OWASP-A01
CWE-22
Updated 2026-03-22

Django XSS via Direct HttpResponse with User Input

HIGH

User input flows directly to HttpResponse without HTML escaping, enabling Cross-Site Scripting (XSS) attacks.

pythondjangoxsshttpresponsehtml-injectiontaint-analysisinter-proceduralCWE-79OWASP-A03
CWE-79
Updated 2026-03-22

Django mark_safe() Usage Audit

MEDIUM

mark_safe() bypasses Django's automatic HTML escaping. Audit all usages to confirm content is properly sanitized before being marked safe.

pythondjangoxssmark-safeauto-escapingauditCWE-79OWASP-A03
CWE-79
Updated 2026-03-22

Django SafeString Subclass Audit

MEDIUM

Class extends SafeString or SafeData, bypassing Django's auto-escaping for all instances. Audit to confirm the class properly sanitizes content.

pythondjangoxsssafestringsafedatasubclassauditCWE-79OWASP-A03
CWE-79
Updated 2026-03-22

Django XSS in HTML Email Body via EmailMessage

MEDIUM

User input flows into HTML email body content without sanitization, enabling HTML injection in emails.

pythondjangoxsshtml-injectionemailemailmessagetaint-analysisinter-proceduralCWE-79OWASP-A03
CWE-79
Updated 2026-03-22

Django XSS in send_mail html_message Parameter

MEDIUM

User input flows into the html_message parameter of send_mail() without sanitization, enabling HTML injection in emails.

pythondjangoxsshtml-injectionemailsend-mailhtml-messagetaint-analysisinter-proceduralCWE-79OWASP-A03
CWE-79
Updated 2026-03-22

Django Insecure Cookie Settings via set_cookie()

MEDIUM

Cookie set without secure, httponly, or samesite flags, making it vulnerable to interception, XSS-based theft, and CSRF attacks.

pythondjangocookiessecurity-misconfigurationhttponlysecuresamesiteauditCWE-614CWE-1004OWASP-A05
CWE-614, CWE-1004
Updated 2026-03-22

Django Insecure Deserialization of Request Data

CRITICAL

User input flows to unsafe deserialization functions (pickle, yaml.load, dill, shelve), enabling arbitrary code execution during deserialization.

pythondjangodeserializationpickleyamldillinsecure-deserializationrcetaint-analysisinter-proceduralCWE-502OWASP-A08
CWE-502
Updated 2026-03-22

Django Empty Password in set_password()

HIGH

Empty string passed to set_password() creates an account with no password protection. Use None or set_unusable_password() instead.

pythondjangopasswordauthenticationempty-passwordset-passwordauditCWE-521CWE-258OWASP-A07
CWE-521, CWE-258
Updated 2026-03-22

Django Default Empty Password Value via flows()

HIGH

request.POST.get('password', '') with empty string default flows to set_password(), potentially setting an empty password when the field is omitted.

pythondjangopasswordauthenticationdefault-valueempty-passwordtaint-analysisCWE-521CWE-287OWASP-A07
CWE-521, CWE-287
Updated 2026-03-22