Skip to content

Commit d225715

Browse files
committed
JS: Type track mssql model
1 parent 6dcee5a commit d225715

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -270,15 +270,27 @@ private module Sqlite {
270270
*/
271271
private module MsSql {
272272
/** Gets a reference to the `mssql` module. */
273-
DataFlow::ModuleImportNode mssql() { result.getPath() = "mssql" }
273+
DataFlow::SourceNode mssql() { result = DataFlow::moduleImport("mssql") }
274274

275-
/** Gets an expression that creates a request object. */
276-
DataFlow::SourceNode request() {
277-
// new require('mssql').Request()
278-
result = mssql().getAConstructorInvocation("Request")
275+
/** Gets a data flow node referring to a request object. */
276+
private DataFlow::SourceNode request(DataFlow::TypeTracker t) {
277+
t.start() and
278+
(
279+
// new require('mssql').Request()
280+
result = mssql().getAConstructorInvocation("Request")
281+
or
282+
// request.input(...)
283+
result = request().getAMethodCall("input")
284+
)
279285
or
280-
// request.input(...)
281-
result = request().getAMethodCall("input")
286+
exists(DataFlow::TypeTracker t2 |
287+
result = request(t2).track(t2, t)
288+
)
289+
}
290+
291+
/** Gets a data flow node referring to a request object. */
292+
DataFlow::SourceNode request() {
293+
result = request(DataFlow::TypeTracker::end())
282294
}
283295

284296
/** A tagged template evaluated as a query. */
@@ -293,15 +305,13 @@ private module MsSql {
293305
}
294306

295307
/** A call to a MsSql query method. */
296-
private class QueryCall extends DatabaseAccess, DataFlow::ValueNode {
297-
override MethodCallExpr astNode;
298-
308+
private class QueryCall extends DatabaseAccess, DataFlow::MethodCallNode {
299309
QueryCall() {
300-
exists(string meth | this = request().getAMethodCall(meth) | meth = "query" or meth = "batch")
310+
this = request().getAMethodCall(["query", "batch"])
301311
}
302312

303313
override DataFlow::Node getAQueryArgument() {
304-
result = DataFlow::valueNode(astNode.getArgument(0))
314+
result = getArgument(0)
305315
}
306316
}
307317

javascript/ql/test/library-tests/frameworks/SQL/SqlString.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
| mssql1.js:7:75:7:79 | value |
33
| mssql2.js:5:15:5:34 | 'select 1 as number' |
44
| mssql2.js:13:15:13:66 | 'create ... table' |
5+
| mssql2.js:22:24:22:43 | 'select 1 as number' |
56
| mysql1.js:13:18:13:43 | 'SELECT ... lution' |
67
| mysql1.js:18:18:22:1 | {\\n s ... vid']\\n} |
78
| mysql2.js:12:12:12:37 | 'SELECT ... lution' |

javascript/ql/test/library-tests/frameworks/SQL/mssql2.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,13 @@ request.query('select 1 as number', (err, result) => {
1313
request.batch('create procedure #temporary as select * from table', (err, result) => {
1414
// ... error checks
1515
})
16+
17+
class C {
18+
constructor(req) {
19+
this.req = req;
20+
}
21+
send() {
22+
this.req.query('select 1 as number', (err, result) => {})
23+
}
24+
}
25+
new C(new sql.Request());

0 commit comments

Comments
 (0)