Skip to content

Commit fc851b4

Browse files
committed
Python: Fix Django class-based views
1 parent fb864b7 commit fc851b4

File tree

6 files changed

+26
-14
lines changed

6 files changed

+26
-14
lines changed

python/ql/src/semmle/python/web/django/Request.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private class DjangoView extends ClassValue {
6767
}
6868

6969
private FunctionValue djangoViewHttpMethod() {
70-
exists(DjangoView view | view.attr(httpVerbLower()) = result)
70+
exists(DjangoView view | view.lookup(httpVerbLower()) = result)
7171
}
7272

7373
class DjangoClassBasedViewRequestArgument extends DjangoRequestSource {

python/ql/test/library-tests/web/django/Sinks.expected

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
| views.py:7 | Attribute() | externally controlled string |
1111
| views.py:11 | Attribute() | externally controlled string |
1212
| views.py:15 | Attribute() | externally controlled string |
13-
| views.py:22 | Attribute() | externally controlled string |
14-
| views.py:27 | Attribute() | externally controlled string |
15-
| views.py:31 | Attribute() | externally controlled string |
13+
| views.py:23 | Attribute() | externally controlled string |
14+
| views.py:29 | Attribute() | externally controlled string |
15+
| views.py:34 | Attribute() | externally controlled string |
16+
| views.py:38 | Attribute() | externally controlled string |

python/ql/test/library-tests/web/django/Sources.expected

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77
| views.py:6 | request | django.request.HttpRequest |
88
| views.py:10 | request | django.request.HttpRequest |
99
| views.py:14 | request | django.request.HttpRequest |
10-
| views.py:25 | page_number | externally controlled string |
11-
| views.py:25 | request | django.request.HttpRequest |
12-
| views.py:30 | arg0 | externally controlled string |
13-
| views.py:30 | arg1 | externally controlled string |
14-
| views.py:30 | request | django.request.HttpRequest |
15-
| views.py:50 | request | django.request.HttpRequest |
16-
| views.py:50 | username | externally controlled string |
17-
| views.py:59 | request | django.request.HttpRequest |
10+
| views.py:22 | request | django.request.HttpRequest |
11+
| views.py:28 | request | django.request.HttpRequest |
12+
| views.py:32 | page_number | externally controlled string |
13+
| views.py:32 | request | django.request.HttpRequest |
14+
| views.py:37 | arg0 | externally controlled string |
15+
| views.py:37 | arg1 | externally controlled string |
16+
| views.py:37 | request | django.request.HttpRequest |
17+
| views.py:57 | request | django.request.HttpRequest |
18+
| views.py:57 | username | externally controlled string |
19+
| views.py:66 | request | django.request.HttpRequest |

python/ql/test/library-tests/web/django/views.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,18 @@ def post_params_xss(request):
1515
return HttpResponse(request.POST.get("untrusted"))
1616

1717

18-
class ClassView(View):
18+
class Foo(object):
19+
# Note: since Foo is used as the super type in a class view, it will be able to handle requests.
1920

21+
# TODO: Currently we don't flag `untrusted` as a DjangoRequestParameter
22+
def post(self, request, untrusted):
23+
return HttpResponse('Foo post: {}'.format(untrusted))
24+
25+
26+
class ClassView(View, Foo):
2027
# TODO: Currently we don't flag `untrusted` as a DjangoRequestParameter
2128
def get(self, request, untrusted):
22-
return HttpResponse('ClassView: {}'.format(untrusted))
29+
return HttpResponse('ClassView get: {}'.format(untrusted))
2330

2431

2532
def show_articles(request, page_number=1):

python/ql/test/query-tests/Security/lib/django/views/__init__.py

Whitespace-only changes.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class View:
2+
pass

0 commit comments

Comments
 (0)