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

Skip to content

Commit e5db0ef

Browse files
committed
remove the RequestExpr requirement from FormParsers.qll, and use API graphs.
1 parent 044f802 commit e5db0ef

1 file changed

Lines changed: 28 additions & 50 deletions

File tree

javascript/ql/src/semmle/javascript/frameworks/FormParsers.qll

Lines changed: 28 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,81 +5,59 @@
55
import javascript
66

77
/**
8-
* Classes and predicate modelling the `Busboy` library.
8+
* A source of remote flow from the `Busboy` library.
99
*/
10-
private module Busboy {
11-
/**
12-
* A `Busboy` instance that has request data flowing into it.
13-
*/
14-
private DataFlow::NewNode busboy() {
15-
result = DataFlow::moduleImport("busboy").getAnInstantiation() and
16-
exists(MethodCallExpr pipe |
17-
pipe.calls(any(HTTP::RequestExpr req), "pipe") and
18-
result.flowsToExpr(pipe.getArgument(0))
19-
)
10+
private class BusBoyRemoteFlow extends RemoteFlowSource {
11+
BusBoyRemoteFlow() {
12+
this =
13+
API::moduleImport("busboy")
14+
.getInstance()
15+
.getMember("on")
16+
.getParameter(1)
17+
.getAParameter()
18+
.getAnImmediateUse()
2019
}
2120

22-
/**
23-
* A source of remote flow from the `Busboy` library.
24-
*/
25-
class BusBoyRemoteFlow extends RemoteFlowSource {
26-
BusBoyRemoteFlow() { this = busboy().getAMemberCall("on").getABoundCallbackParameter(1, _) }
27-
28-
override string getSourceType() { result = "parsed user value from Busbuy" }
29-
}
21+
override string getSourceType() { result = "parsed user value from Busbuy" }
3022
}
3123

3224
/**
3325
* A source of remote flow from the `Formidable` library parsing a HTTP request.
3426
*/
3527
private class FormidableRemoteFlow extends RemoteFlowSource {
3628
FormidableRemoteFlow() {
37-
exists(DataFlow::CallNode parse, DataFlow::InvokeNode formidable |
38-
formidable = DataFlow::moduleImport("formidable").getACall()
29+
exists(API::Node formidable |
30+
formidable = API::moduleImport("formidable").getReturn()
3931
or
40-
formidable = DataFlow::moduleMember("formidable", "formidable").getACall()
32+
formidable = API::moduleImport("formidable").getMember("formidable").getReturn()
4133
or
4234
formidable =
43-
DataFlow::moduleMember("formidable", ["IncomingForm", "Formidable"]).getAnInstantiation()
35+
API::moduleImport("formidable").getMember(["IncomingForm", "Formidable"]).getInstance()
4436
|
45-
parse = formidable.getAMemberCall("parse") and
46-
parse.getArgument(0).asExpr() instanceof HTTP::RequestExpr and
47-
this = parse.getABoundCallbackParameter(1, any(int i | i > 0))
37+
this =
38+
formidable.getMember("parse").getACall().getABoundCallbackParameter(1, any(int i | i > 0))
4839
)
4940
}
5041

5142
override string getSourceType() { result = "parsed user value from Formidable" }
5243
}
5344

5445
/**
55-
* Predicates and classes modelling the `multiparty` library.
46+
* A source of remote flow from the `Multiparty` library.
5647
*/
57-
private module Multiparty {
58-
/**
59-
* Gets an instance of of `Multiparty` form parser that parses a HTTP request object.
60-
* The `parse` call is the method call that receives the HTTP request object.
61-
*/
62-
private DataFlow::SourceNode form(DataFlow::MethodCallNode parse) {
63-
result = DataFlow::moduleMember("multiparty", "Form").getAnInstantiation() and
64-
parse = result.getAMethodCall("parse") and
65-
parse.getArgument(0).asExpr() instanceof HTTP::RequestExpr
66-
}
67-
68-
/**
69-
* A source of remote flow from the `Multiparty` library.
70-
*/
71-
class MultipartyRemoteFlow extends RemoteFlowSource {
72-
MultipartyRemoteFlow() {
73-
exists(DataFlow::MethodCallNode parse | exists(form(parse)) |
74-
this = parse.getABoundCallbackParameter(1, any(int i | i > 0))
48+
private class MultipartyRemoteFlow extends RemoteFlowSource {
49+
MultipartyRemoteFlow() {
50+
exists(API::Node form | form = API::moduleImport("multiparty").getMember("Form").getInstance() |
51+
exists(API::CallNode parse | parse = form.getMember("parse").getACall() |
52+
this = parse.getParameter(1).getAParameter().getAnImmediateUse()
7553
)
7654
or
77-
exists(DataFlow::MethodCallNode on | on = form(_).getAMethodCall("on") |
55+
exists(API::CallNode on | on = form.getMember("on").getACall() |
7856
on.getArgument(0).mayHaveStringValue(["part", "file", "field"]) and
79-
this = on.getABoundCallbackParameter(1, _)
57+
this = on.getParameter(1).getAParameter().getAnImmediateUse()
8058
)
81-
}
82-
83-
override string getSourceType() { result = "parsed user value from Multiparty" }
59+
)
8460
}
61+
62+
override string getSourceType() { result = "parsed user value from Multiparty" }
8563
}

0 commit comments

Comments
 (0)