@@ -11,35 +11,49 @@ private import experimental.semmle.python.Concepts
11
11
private import semmle.python.ApiGraphs
12
12
13
13
private module NoSQL {
14
- /** API Nodes returning `Mongo` instances. */
14
+ // API Nodes returning `Mongo` instances.
15
+ /** Gets a reference to `pymongo.MongoClient` */
15
16
private API:: Node pyMongo ( ) {
16
17
result = API:: moduleImport ( "pymongo" ) .getMember ( "MongoClient" ) .getReturn ( )
17
18
}
18
19
20
+ /** Gets a reference to `flask_pymongo.PyMongo` */
19
21
private API:: Node flask_PyMongo ( ) {
20
22
result = API:: moduleImport ( "flask_pymongo" ) .getMember ( "PyMongo" ) .getReturn ( )
21
23
}
22
24
25
+ /** Gets a reference to `mongoengine` */
23
26
private API:: Node mongoEngine ( ) { result = API:: moduleImport ( "mongoengine" ) }
24
27
28
+ /** Gets a reference to `flask_mongoengine.MongoEngine` */
25
29
private API:: Node flask_MongoEngine ( ) {
26
30
result = API:: moduleImport ( "flask_mongoengine" ) .getMember ( "MongoEngine" ) .getReturn ( )
27
31
}
28
32
29
- /** Gets a reference to a initialized `Mongo` instance. */
33
+ /**
34
+ * Gets a reference to a initialized `Mongo` instance.
35
+ * See `pyMongo()`, `flask_PyMongo()`
36
+ */
30
37
private API:: Node mongoInstance ( ) {
31
38
result = pyMongo ( ) or
32
39
result = flask_PyMongo ( )
33
40
}
34
41
35
- /** Gets a reference to a initialized `Mongo` DB instance. */
42
+ /**
43
+ * Gets a reference to a initialized `Mongo` DB instance.
44
+ * See `mongoEngine()`, `flask_MongoEngine()`
45
+ */
36
46
private API:: Node mongoDBInstance ( ) {
37
47
result = mongoEngine ( ) .getMember ( [ "get_db" , "connect" ] ) .getReturn ( ) or
38
48
result = mongoEngine ( ) .getMember ( "connection" ) .getMember ( [ "get_db" , "connect" ] ) .getReturn ( ) or
39
49
result = flask_MongoEngine ( ) .getMember ( "get_db" ) .getReturn ( )
40
50
}
41
51
42
- /** Gets a reference to a `Mongo` DB use. */
52
+ /**
53
+ * Gets a reference to a `Mongo` DB use.
54
+ *
55
+ * See `mongoInstance()`, `mongoDBInstance()`.
56
+ */
43
57
private DataFlow:: LocalSourceNode mongoDB ( DataFlow:: TypeTracker t ) {
44
58
t .start ( ) and
45
59
(
@@ -56,10 +70,24 @@ private module NoSQL {
56
70
exists ( DataFlow:: TypeTracker t2 | result = mongoDB ( t2 ) .track ( t2 , t ) )
57
71
}
58
72
59
- /** Gets a reference to a `Mongo` DB use. */
73
+ /**
74
+ * Gets a reference to a `Mongo` DB use.
75
+ *
76
+ * ```py
77
+ * from flask_pymongo import PyMongo
78
+ * mongo = PyMongo(app)
79
+ * mongo.db.user.find({'name': safe_search})
80
+ * ```
81
+ *
82
+ * `mongo.db` would be a `use` of a `Mongo` instance, and so the result.
83
+ */
60
84
private DataFlow:: Node mongoDB ( ) { mongoDB ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result ) }
61
85
62
- /** Gets a reference to a `Mongo` collection use. */
86
+ /**
87
+ * Gets a reference to a `Mongo` collection use.
88
+ *
89
+ * See `mongoDB()`.
90
+ */
63
91
private DataFlow:: LocalSourceNode mongoCollection ( DataFlow:: TypeTracker t ) {
64
92
t .start ( ) and
65
93
(
@@ -73,7 +101,17 @@ private module NoSQL {
73
101
exists ( DataFlow:: TypeTracker t2 | result = mongoCollection ( t2 ) .track ( t2 , t ) )
74
102
}
75
103
76
- /** Gets a reference to a `Mongo` collection use. */
104
+ /**
105
+ * Gets a reference to a `Mongo` collection use.
106
+ *
107
+ * ```py
108
+ * from flask_pymongo import PyMongo
109
+ * mongo = PyMongo(app)
110
+ * mongo.db.user.find({'name': safe_search})
111
+ * ```
112
+ *
113
+ * `mongo.db.user` would be a `use` of a `Mongo` collection, and so the result.
114
+ */
77
115
private DataFlow:: Node mongoCollection ( ) {
78
116
mongoCollection ( DataFlow:: TypeTracker:: end ( ) ) .flowsTo ( result )
79
117
}
@@ -88,19 +126,54 @@ private module NoSQL {
88
126
}
89
127
}
90
128
91
- /** Gets a reference to a `Mongo` collection method. */
129
+ /**
130
+ * Gets a reference to a `Mongo` collection method.
131
+ *
132
+ * ```py
133
+ * from flask_pymongo import PyMongo
134
+ * mongo = PyMongo(app)
135
+ * mongo.db.user.find({'name': safe_search})
136
+ * ```
137
+ *
138
+ * `mongo.db.user.find` would be a collection method, and so the result.
139
+ */
92
140
private DataFlow:: Node mongoCollectionMethod ( ) {
93
- mongoCollection ( ) in [ result .( DataFlow:: AttrRead ) , result . ( DataFlow :: AttrRead ) . getObject ( ) ] and
141
+ mongoCollection ( ) = result .( DataFlow:: AttrRead ) . getObject ( ) and
94
142
result .( DataFlow:: AttrRead ) .getAttributeName ( ) instanceof MongoCollectionMethodNames
95
143
}
96
144
97
- /** Gets a reference to a `Mongo` collection method call */
145
+ /**
146
+ * Gets a reference to a `Mongo` collection method call
147
+ *
148
+ * ```py
149
+ * from flask_pymongo import PyMongo
150
+ * mongo = PyMongo(app)
151
+ * mongo.db.user.find({'name': safe_search})
152
+ * ```
153
+ *
154
+ * `mongo.db.user.find({'name': safe_search})` would be a collection method call, and so the result.
155
+ */
98
156
private class MongoCollectionCall extends DataFlow:: CallCfgNode , NoSQLQuery:: Range {
99
157
MongoCollectionCall ( ) { this .getFunction ( ) = mongoCollectionMethod ( ) }
100
158
101
159
override DataFlow:: Node getQuery ( ) { result = this .getArg ( 0 ) }
102
160
}
103
161
162
+ /**
163
+ * Gets a reference to a call from a class whose base is a reference to `mongoEngine()` or `flask_MongoEngine()`'s
164
+ * `Document` or `EmbeddedDocument` objects and its attribute is `objects`.
165
+ *
166
+ * ```py
167
+ * from flask_mongoengine import MongoEngine
168
+ * db = MongoEngine(app)
169
+ * class Movie(db.Document):
170
+ * title = db.StringField(required=True)
171
+ *
172
+ * Movie.objects(__raw__=json_search)
173
+ * ```
174
+ *
175
+ * `Movie.objects(__raw__=json_search)` would be the result.
176
+ */
104
177
private class MongoEngineObjectsCall extends DataFlow:: CallCfgNode , NoSQLQuery:: Range {
105
178
MongoEngineObjectsCall ( ) {
106
179
this =
@@ -114,6 +187,7 @@ private module NoSQL {
114
187
override DataFlow:: Node getQuery ( ) { result = this .getArgByName ( _) }
115
188
}
116
189
190
+ /** Gets a reference to `mongosanitizer.sanitizer.sanitize` */
117
191
private class MongoSanitizerCall extends DataFlow:: CallCfgNode , NoSQLSanitizer:: Range {
118
192
MongoSanitizerCall ( ) {
119
193
this =
0 commit comments