Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 49dd221

Browse files
committed
Python: Refactor django library
Use General.qll for routing, like in other web libraries
1 parent fc8c1e1 commit 49dd221

2 files changed

Lines changed: 35 additions & 34 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import python
2+
import semmle.python.regex
3+
import semmle.python.web.Http
4+
5+
predicate django_route(CallNode call, ControlFlowNode regex, FunctionValue view) {
6+
exists(FunctionValue url |
7+
Value::named("django.conf.urls.url") = url and
8+
url.getArgumentForCall(call, 0) = regex and
9+
url.getArgumentForCall(call, 1).pointsTo(view)
10+
)
11+
}
12+
13+
class DjangoRouteRegex extends RegexString {
14+
DjangoRouteRegex() { django_route(_, this.getAFlowNode(), _) }
15+
}
16+
17+
class DjangoRoute extends CallNode {
18+
DjangoRoute() { django_route(this, _, _) }
19+
20+
FunctionValue getViewFunction() { django_route(this, _, result) }
21+
22+
string getNamedArgument() {
23+
exists(DjangoRouteRegex regex |
24+
django_route(this, regex.getAFlowNode(), _) and
25+
regex.getGroupName(_, _) = result
26+
)
27+
}
28+
}

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

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import python
2-
import semmle.python.regex
32
import semmle.python.security.TaintTracking
43
import semmle.python.web.Http
4+
import semmle.python.web.django.General
55

66
/** A django.request.HttpRequest object */
77
class DjangoRequest extends TaintKind {
@@ -52,7 +52,7 @@ abstract class DjangoRequestSource extends HttpRequestTaintSource {
5252
private class DjangoFunctionBasedViewRequestArgument extends DjangoRequestSource {
5353
DjangoFunctionBasedViewRequestArgument() {
5454
exists(FunctionValue view |
55-
url_dispatch(_, _, view) and
55+
django_route(_, _, view) and
5656
this = view.getScope().getArg(0).asName().getAFlowNode()
5757
)
5858
}
@@ -76,41 +76,14 @@ class DjangoClassBasedViewRequestArgument extends DjangoRequestSource {
7676
}
7777
}
7878

79-
/* *********** Routing ********* */
80-
/* Function based views */
81-
predicate url_dispatch(CallNode call, ControlFlowNode regex, FunctionValue view) {
82-
exists(FunctionValue url |
83-
Value::named("django.conf.urls.url") = url and
84-
url.getArgumentForCall(call, 0) = regex and
85-
url.getArgumentForCall(call, 1).pointsTo(view)
86-
)
87-
}
88-
89-
class UrlRegex extends RegexString {
90-
UrlRegex() { url_dispatch(_, this.getAFlowNode(), _) }
91-
}
92-
93-
class UrlRouting extends CallNode {
94-
UrlRouting() { url_dispatch(this, _, _) }
95-
96-
FunctionValue getViewFunction() { url_dispatch(this, _, result) }
97-
98-
string getNamedArgument() {
99-
exists(UrlRegex regex |
100-
url_dispatch(this, regex.getAFlowNode(), _) and
101-
regex.getGroupName(_, _) = result
102-
)
103-
}
104-
}
105-
10679
/** An argument specified in a url routing table */
107-
class HttpRequestParameter extends HttpRequestTaintSource {
108-
HttpRequestParameter() {
109-
exists(UrlRouting url |
110-
this.(ControlFlowNode).getNode() = url
80+
class DjangoRequestParameter extends HttpRequestTaintSource {
81+
DjangoRequestParameter() {
82+
exists(DjangoRoute route |
83+
this.(ControlFlowNode).getNode() = route
11184
.getViewFunction()
11285
.getScope()
113-
.getArgByName(url.getNamedArgument())
86+
.getArgByName(route.getNamedArgument())
11487
)
11588
}
11689

0 commit comments

Comments
 (0)