@@ -222,10 +222,10 @@ private class PrimitiveSanitizer extends RequestForgerySanitizer {
222
222
}
223
223
}
224
224
225
- private class HostnameSanitizingPrefix extends CompileTimeConstantExpr {
225
+ private class HostnameSanitizingConstantPrefix extends CompileTimeConstantExpr {
226
226
int offset ;
227
227
228
- HostnameSanitizingPrefix ( ) {
228
+ HostnameSanitizingConstantPrefix ( ) {
229
229
// Matches strings that look like when prepended to untrusted input, they will restrict
230
230
// the host or entity addressed: for example, anything containing `?` or `#`, or a slash that
231
231
// doesn't appear to be a protocol specifier (e.g. `http://` is not sanitizing), or specifically
@@ -242,21 +242,10 @@ private class HostnameSanitizingPrefix extends CompileTimeConstantExpr {
242
242
int getOffset ( ) { result = offset }
243
243
}
244
244
245
- private AddExpr getParentAdd ( AddExpr e ) { result = e .getParent ( ) }
246
-
247
- private AddExpr getAnAddContainingHostnameSanitizingPrefix ( ) {
248
- result = getParentAdd * ( any ( HostnameSanitizingPrefix p ) .getParent ( ) )
249
- }
250
-
251
- private Expr getASanitizedAddOperand ( ) {
252
- exists ( AddExpr e |
253
- e = getAnAddContainingHostnameSanitizingPrefix ( ) and
254
- (
255
- e .getLeftOperand ( ) = getAnAddContainingHostnameSanitizingPrefix ( ) or
256
- e .getLeftOperand ( ) instanceof HostnameSanitizingPrefix
257
- ) and
258
- result = e .getRightOperand ( )
259
- )
245
+ private Expr getAHostnameSanitizingPrefix ( ) {
246
+ result instanceof HostnameSanitizingConstantPrefix
247
+ or
248
+ result .( AddExpr ) .getAnOperand ( ) = getAHostnameSanitizingPrefix ( )
260
249
}
261
250
262
251
private MethodAccess getNextAppend ( MethodAccess append ) {
@@ -283,15 +272,16 @@ private MethodAccess getAChainedAppend(Expr e) {
283
272
private class HostnameSanitizedExpr extends Expr {
284
273
HostnameSanitizedExpr ( ) {
285
274
// Sanitize expressions that come after a sanitizing prefix in a tree of string additions:
286
- this = getASanitizedAddOperand ( )
275
+ this =
276
+ any ( AddExpr add | add .getLeftOperand ( ) = getAHostnameSanitizingPrefix ( ) ) .getRightOperand ( )
287
277
or
288
278
// Sanitize all appends to a StringBuilder that is initialized with a sanitizing prefix:
289
279
// (note imprecision: if the same StringBuilder/StringBuffer has more than one constructor call,
290
280
// this sanitizes all of its append calls, not just those that may follow the constructor).
291
281
exists ( StringBuilderVar sbv , ConstructorCall constructor , Expr initializer |
292
282
initializer = sbv .getAnAssignedValue ( ) and
293
283
constructor = getQualifier * ( initializer ) and
294
- constructor .getArgument ( 0 ) instanceof HostnameSanitizingPrefix and
284
+ constructor .getArgument ( 0 ) = getAHostnameSanitizingPrefix ( ) and
295
285
(
296
286
this = sbv .getAnAppend ( ) .getArgument ( 0 )
297
287
or
@@ -301,14 +291,15 @@ private class HostnameSanitizedExpr extends Expr {
301
291
or
302
292
// Sanitize expressions that come after a sanitizing prefix in a sequence of StringBuilder operations:
303
293
exists ( MethodAccess appendSanitizingConstant , MethodAccess subsequentAppend |
304
- appendSanitizingConstant .getArgument ( 0 ) instanceof HostnameSanitizingPrefix and
294
+ appendSanitizingConstant = any ( StringBuilderVar v ) .getAnAppend ( ) and
295
+ appendSanitizingConstant .getArgument ( 0 ) = getAHostnameSanitizingPrefix ( ) and
305
296
getNextAppend * ( appendSanitizingConstant ) = subsequentAppend and
306
297
this = subsequentAppend .getArgument ( 0 )
307
298
)
308
299
or
309
300
// Sanitize expressions that come after a sanitizing prefix in the args to a format call:
310
301
exists (
311
- FormattingCall formatCall , FormatString formatString , HostnameSanitizingPrefix prefix ,
302
+ FormattingCall formatCall , FormatString formatString , HostnameSanitizingConstantPrefix prefix ,
312
303
int sanitizedFromOffset , int laterOffset , int sanitizedArg
313
304
|
314
305
formatString = unique( FormatString fs | fs = formatCall .getAFormatString ( ) ) and
0 commit comments