Skip to content

Commit f3aea07

Browse files
committed
JS: Use type info in Express Request/Response
1 parent 641232a commit f3aea07

File tree

1 file changed

+34
-4
lines changed
  • javascript/ql/src/semmle/javascript/frameworks

1 file changed

+34
-4
lines changed

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

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,14 +340,18 @@ module Express {
340340
)
341341
}
342342

343+
/** An Express response source. */
344+
abstract private class ResponseSource extends HTTP::Servers::ResponseSource {
345+
}
346+
343347
/**
344348
* An Express response source, that is, the response parameter of a
345349
* route handler, or a chained method call on a response.
346350
*/
347-
private class ResponseSource extends HTTP::Servers::ResponseSource {
351+
private class ExplicitResponseSource extends ResponseSource {
348352
RouteHandler rh;
349353

350-
ResponseSource() {
354+
ExplicitResponseSource() {
351355
this = DataFlow::parameterNode(rh.getResponseParameter())
352356
or
353357
isChainableResponseMethodCall(rh, this.asExpr())
@@ -359,21 +363,47 @@ module Express {
359363
override RouteHandler getRouteHandler() { result = rh }
360364
}
361365

366+
/**
367+
* An Express response source, based on static type information.
368+
*/
369+
private class TypedResponseSource extends ResponseSource {
370+
TypedResponseSource() {
371+
hasUnderlyingType("express-serve-static-core", "Response") // super type of 'express'.Response
372+
}
373+
374+
override RouteHandler getRouteHandler() { none() } // Not known.
375+
}
376+
377+
/** An Express request source. */
378+
abstract private class RequestSource extends HTTP::Servers::RequestSource {
379+
}
380+
362381
/**
363382
* An Express request source, that is, the request parameter of a
364383
* route handler.
365384
*/
366-
private class RequestSource extends HTTP::Servers::RequestSource {
385+
private class ExplicitRequestSource extends RequestSource {
367386
RouteHandler rh;
368387

369-
RequestSource() { this = DataFlow::parameterNode(rh.getRequestParameter()) }
388+
ExplicitRequestSource() { this = DataFlow::parameterNode(rh.getRequestParameter()) }
370389

371390
/**
372391
* Gets the route handler that handles this request.
373392
*/
374393
override RouteHandler getRouteHandler() { result = rh }
375394
}
376395

396+
/**
397+
* An Express request source, based on static type information.
398+
*/
399+
private class TypedRequestSource extends RequestSource {
400+
TypedRequestSource() {
401+
hasUnderlyingType("express-serve-static-core", "Request") // super type of 'express'.Request
402+
}
403+
404+
override RouteHandler getRouteHandler() { none() } // Not known.
405+
}
406+
377407
/**
378408
* An Express response expression.
379409
*/

0 commit comments

Comments
 (0)