Skip to content

Commit 93500bd

Browse files
committed
JS: Improve mssql model
1 parent 95937c9 commit 93500bd

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

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

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,32 @@ private module MsSql {
371371
/** Gets a reference to the `mssql` module. */
372372
API::Node mssql() { result = API::moduleImport("mssql") }
373373

374-
/** Gets an expression that creates a request object. */
374+
/** Gets a node referring to an instance of the given class. */
375+
API::Node mssqlClass(string name) {
376+
result = mssql().getMember(name).getInstance()
377+
or
378+
result = API::Node::ofType("mssql", name)
379+
}
380+
381+
/** Gets an API node referring to a Request object. */
375382
API::Node request() {
376-
// new require('mssql').Request()
377-
result = mssql().getMember("Request").getInstance()
383+
result = mssqlClass("Request")
378384
or
379-
// request.input(...)
380-
result = request().getMember("input").getReturn()
385+
result = request().getMember(["input", "replaceInput", "output", "replaceOutput"]).getReturn()
386+
or
387+
result = [transaction(), pool()].getMember("request").getReturn()
381388
}
382389

390+
/** Gets an API node referring to a Transaction object. */
391+
API::Node transaction() {
392+
result = mssqlClass("Transaction")
393+
or
394+
result = pool().getMember("transaction").getReturn()
395+
}
396+
397+
/** Gets a API node referring to a ConnectionPool object. */
398+
API::Node pool() { result = mssqlClass("ConnectionPool") }
399+
383400
/** A tagged template evaluated as a query. */
384401
private class QueryTemplateExpr extends DatabaseAccess, DataFlow::ValueNode {
385402
override TaggedTemplateExpr astNode;
@@ -395,7 +412,7 @@ private module MsSql {
395412

396413
/** A call to a MsSql query method. */
397414
private class QueryCall extends DatabaseAccess, DataFlow::MethodCallNode {
398-
QueryCall() { this = request().getMember(["query", "batch"]).getACall() }
415+
QueryCall() { this = [mssql(), request()].getMember(["query", "batch"]).getACall() }
399416

400417
override DataFlow::Node getAQueryArgument() { result = getArgument(0) }
401418
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
| mssql1.js:7:40:7:72 | select ... e id = |
22
| mssql1.js:7:75:7:79 | value |
3+
| mssql1.js:10:19:10:30 | 'SELECT 123' |
34
| mssql2.js:5:15:5:34 | 'select 1 as number' |
45
| mssql2.js:13:15:13:66 | 'create ... table' |
56
| mssql2.js:22:24:22:43 | 'select 1 as number' |
67
| mssql2.js:29:30:29:81 | 'create ... table' |
8+
| mssql-types.ts:7:31:7:42 | 'SELECT 123' |
79
| mysql1.js:13:18:13:43 | 'SELECT ... lution' |
810
| mysql1.js:18:18:22:1 | {\\n s ... vid']\\n} |
911
| mysql1a.js:17:18:17:43 | 'SELECT ... lution' |
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { ConnectionPool } from "mssql";
2+
3+
class Foo {
4+
constructor(private pool: ConnectionPool) {}
5+
6+
doSomething() {
7+
this.pool.request().query('SELECT 123');
8+
}
9+
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ async () => {
66
const pool = await sql.connect('mssql://username:password@localhost/database')
77
const result = await sql.query`select * from mytable where id = ${value}`
88
console.dir(result)
9+
10+
sql.query('SELECT 123');
911
} catch (err) {
1012
// ... error checks
1113
}

0 commit comments

Comments
 (0)