2424
2525import javascript
2626private import semmle.javascript.frameworks.ConnectExpressShared:: ConnectExpressShared
27+ private import ApiGraphs
2728
2829// main concepts
2930/**
@@ -126,7 +127,7 @@ abstract class RateLimiter extends Express::RouteHandlerExpr { }
126127 */
127128class ExpressRateLimit extends RateLimiter {
128129 ExpressRateLimit ( ) {
129- DataFlow :: moduleImport ( "express-rate-limit" ) .getAnInvocation ( ) .flowsToExpr ( this )
130+ this = API :: moduleImport ( "express-rate-limit" ) .getReturn ( ) .getAUse ( ) . asExpr ( )
130131 }
131132}
132133
@@ -135,11 +136,7 @@ class ExpressRateLimit extends RateLimiter {
135136 */
136137class BruteForceRateLimit extends RateLimiter {
137138 BruteForceRateLimit ( ) {
138- exists ( DataFlow:: ModuleImportNode expressBrute , DataFlow:: SourceNode prevent |
139- expressBrute .getPath ( ) = "express-brute" and
140- prevent = expressBrute .getAnInstantiation ( ) .getAPropertyRead ( "prevent" ) and
141- prevent .flowsToExpr ( this )
142- )
139+ this = API:: moduleImport ( "express-brute" ) .getInstance ( ) .getMember ( "prevent" ) .getAUse ( ) .asExpr ( )
143140 }
144141}
145142
@@ -148,9 +145,9 @@ class BruteForceRateLimit extends RateLimiter {
148145 */
149146class RouteHandlerLimitedByExpressLimiter extends RateLimitedRouteHandlerExpr {
150147 RouteHandlerLimitedByExpressLimiter ( ) {
151- exists ( DataFlow :: ModuleImportNode expressLimiter |
152- expressLimiter . getPath ( ) = "express-limiter" and
153- expressLimiter .getACall ( ) . getArgument ( 0 ) .getALocalSource ( ) .asExpr ( ) =
148+ exists ( API :: Feature expressLimiter |
149+ expressLimiter = API :: moduleImport ( "express-limiter" ) and
150+ expressLimiter .getParameter ( 0 ) . getADefinition ( ) .getALocalSource ( ) .asExpr ( ) =
154151 this .getSetup ( ) .getRouter ( )
155152 )
156153 }
@@ -175,14 +172,14 @@ class RouteHandlerLimitedByExpressLimiter extends RateLimitedRouteHandlerExpr {
175172class RateLimiterFlexibleRateLimiter extends DataFlow:: FunctionNode {
176173 RateLimiterFlexibleRateLimiter ( ) {
177174 exists (
178- string rateLimiterClassName , DataFlow :: SourceNode rateLimiterClass ,
179- DataFlow:: SourceNode rateLimiterInstance , DataFlow :: ParameterNode request
175+ string rateLimiterClassName , API :: Feature rateLimiterClass , API :: Feature rateLimiterConsume ,
176+ DataFlow:: ParameterNode request
180177 |
181178 rateLimiterClassName .matches ( "RateLimiter%" ) and
182- rateLimiterClass = DataFlow :: moduleMember ( "rate-limiter-flexible" , rateLimiterClassName ) and
183- rateLimiterInstance = rateLimiterClass .getAnInstantiation ( ) and
179+ rateLimiterClass = API :: moduleImport ( "rate-limiter-flexible" ) . getMember ( rateLimiterClassName ) and
180+ rateLimiterConsume = rateLimiterClass .getInstance ( ) . getMember ( "consume" ) and
184181 request .getParameter ( ) = getRouteHandlerParameter ( getFunction ( ) , "request" ) and
185- request .getAPropertyRead ( ) = rateLimiterInstance . getAMemberCall ( "consume" ) . getAnArgument ( )
182+ request .getAPropertyRead ( ) . flowsTo ( rateLimiterConsume . getAParameter ( ) . getADefinition ( ) )
186183 )
187184 }
188185}
0 commit comments