Skip to content

Commit 49ca889

Browse files
committed
JS: Use types
1 parent 603843e commit 49ca889

File tree

3 files changed

+42
-3
lines changed

3 files changed

+42
-3
lines changed

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,24 @@ private module Postgres {
166166
API::Node pgPromise() { result = API::moduleImport("pg-promise") }
167167

168168
/** Gets an initialized `pg-promise` library. */
169-
API::Node pgpMain() { result = pgPromise().getReturn() }
169+
API::Node pgpMain() {
170+
result = pgPromise().getReturn()
171+
or
172+
result = API::Node::ofType("pg-promise", "IMain")
173+
}
170174

171175
/** Gets a database from `pg-promise`. */
172-
API::Node pgpDatabase() { result = pgpMain().getReturn() }
176+
API::Node pgpDatabase() {
177+
result = pgpMain().getReturn()
178+
or
179+
result = API::Node::ofType("pg-promise", "IDatabase")
180+
}
173181

174182
/** Gets a connection created from a `pg-promise` database. */
175183
API::Node pgpConnection() {
176184
result = pgpDatabase().getMember("connect").getReturn().getPromised()
185+
or
186+
result = API::Node::ofType("pg-promise", "IConnected")
177187
}
178188

179189
/** Gets a `pg-promise` task object. */
@@ -185,10 +195,16 @@ private module Postgres {
185195
or
186196
result = taskMethod.getParameter(0).getMember("cnd").getParameter(0)
187197
)
198+
or
199+
result = API::Node::ofType("pg-promise", "ITask")
188200
}
189201

190202
/** Gets a `pg-promise` object which supports querying (database, connection, or task). */
191-
API::Node pgpObject() { result = [pgpDatabase(), pgpConnection(), pgpTask()] }
203+
API::Node pgpObject() {
204+
result = [pgpDatabase(), pgpConnection(), pgpTask()]
205+
or
206+
result = API::Node::ofType("pg-promise", "IBaseProtocol")
207+
}
192208

193209
private string pgpQueryMethodName() {
194210
result =

javascript/ql/test/query-tests/Security/CWE-089/untyped/SqlInjection.expected

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ nodes
206206
| mongooseModelClient.js:12:22:12:29 | req.body |
207207
| mongooseModelClient.js:12:22:12:29 | req.body |
208208
| mongooseModelClient.js:12:22:12:32 | req.body.id |
209+
| pg-promise-types.ts:7:9:7:28 | taint |
210+
| pg-promise-types.ts:7:17:7:28 | req.params.x |
211+
| pg-promise-types.ts:7:17:7:28 | req.params.x |
212+
| pg-promise-types.ts:8:17:8:21 | taint |
213+
| pg-promise-types.ts:8:17:8:21 | taint |
209214
| pg-promise.js:6:7:7:55 | query |
210215
| pg-promise.js:6:15:7:55 | "SELECT ... PRICE" |
211216
| pg-promise.js:7:16:7:34 | req.params.category |
@@ -612,6 +617,10 @@ edges
612617
| mongooseModelClient.js:12:22:12:29 | req.body | mongooseModelClient.js:12:22:12:32 | req.body.id |
613618
| mongooseModelClient.js:12:22:12:32 | req.body.id | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } |
614619
| mongooseModelClient.js:12:22:12:32 | req.body.id | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } |
620+
| pg-promise-types.ts:7:9:7:28 | taint | pg-promise-types.ts:8:17:8:21 | taint |
621+
| pg-promise-types.ts:7:9:7:28 | taint | pg-promise-types.ts:8:17:8:21 | taint |
622+
| pg-promise-types.ts:7:17:7:28 | req.params.x | pg-promise-types.ts:7:9:7:28 | taint |
623+
| pg-promise-types.ts:7:17:7:28 | req.params.x | pg-promise-types.ts:7:9:7:28 | taint |
615624
| pg-promise.js:6:7:7:55 | query | pg-promise.js:9:10:9:14 | query |
616625
| pg-promise.js:6:7:7:55 | query | pg-promise.js:9:10:9:14 | query |
617626
| pg-promise.js:6:7:7:55 | query | pg-promise.js:10:11:10:15 | query |
@@ -776,6 +785,7 @@ edges
776785
| mongooseJsonParse.js:23:19:23:23 | query | mongooseJsonParse.js:20:30:20:43 | req.query.data | mongooseJsonParse.js:23:19:23:23 | query | This query depends on $@. | mongooseJsonParse.js:20:30:20:43 | req.query.data | a user-provided value |
777786
| mongooseModelClient.js:11:16:11:24 | { id: v } | mongooseModelClient.js:10:22:10:29 | req.body | mongooseModelClient.js:11:16:11:24 | { id: v } | This query depends on $@. | mongooseModelClient.js:10:22:10:29 | req.body | a user-provided value |
778787
| mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | mongooseModelClient.js:12:22:12:29 | req.body | mongooseModelClient.js:12:16:12:34 | { id: req.body.id } | This query depends on $@. | mongooseModelClient.js:12:22:12:29 | req.body | a user-provided value |
788+
| pg-promise-types.ts:8:17:8:21 | taint | pg-promise-types.ts:7:17:7:28 | req.params.x | pg-promise-types.ts:8:17:8:21 | taint | This query depends on $@. | pg-promise-types.ts:7:17:7:28 | req.params.x | a user-provided value |
779789
| pg-promise.js:9:10:9:14 | query | pg-promise.js:7:16:7:34 | req.params.category | pg-promise.js:9:10:9:14 | query | This query depends on $@. | pg-promise.js:7:16:7:34 | req.params.category | a user-provided value |
780790
| pg-promise.js:10:11:10:15 | query | pg-promise.js:7:16:7:34 | req.params.category | pg-promise.js:10:11:10:15 | query | This query depends on $@. | pg-promise.js:7:16:7:34 | req.params.category | a user-provided value |
781791
| pg-promise.js:11:17:11:21 | query | pg-promise.js:7:16:7:34 | req.params.category | pg-promise.js:11:17:11:21 | query | This query depends on $@. | pg-promise.js:7:16:7:34 | req.params.category | a user-provided value |
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { IDatabase } from "pg-promise";
2+
3+
export class Foo {
4+
db: IDatabase;
5+
6+
onRequest(req, res) {
7+
let taint = req.params.x;
8+
this.db.one(taint); // NOT OK
9+
res.end();
10+
}
11+
}
12+
13+
require('express')().get('/foo', (req, res) => new Foo().onRequest(req, res));

0 commit comments

Comments
 (0)