@@ -332,33 +332,155 @@ public static function getNodeIncludeInfo($node){
332
332
* @param string $funcName
333
333
* @return array(is_sink,args_position)
334
334
*/
335
- public static function isSinkFunction ($ funcName ){
336
- global $ F_SINK_ALL ,$ F_SINK_ARRAY ;
335
+ public static function isSinkFunction ($ funcName, $ scanType ){
336
+ global $ F_SINK_ALL , $ F_SINK_ARRAY ;
337
337
$ nameNum = count ($ F_SINK_ARRAY );
338
338
$ userDefinedSink = UserDefinedSinkContext::getInstance () ;
339
339
$ U_SINK_ALL = $ userDefinedSink ->getAllSinks () ;
340
340
341
- //如果是系统的sink
342
- if (key_exists ($ funcName , $ F_SINK_ALL )){
343
- for ($ i = 0 ;$ i < $ nameNum ; $ i ++){
344
- if (key_exists ($ funcName , $ F_SINK_ARRAY [$ i ])){
345
- return array (true ,$ F_SINK_ARRAY [$ i ][$ funcName ][0 ]);
346
- }
347
- }
348
- return array (false );
349
- }
350
-
351
- //如果是用户的sink
352
- if (key_exists ($ funcName , $ U_SINK_ALL )){
353
- foreach ($ userDefinedSink ->getAllSinkArray () as $ value ){
354
- if (key_exists ($ funcName , $ value )){
355
- return array (true ,$ U_SINK_ALL [$ funcName ]) ;
356
- }
357
- }
358
-
359
- return array (false ) ;
341
+ //根据scanType,查找sink函数
342
+ switch ($ scanType ){
343
+ case 'ALL ' :
344
+ //如果是系统的sink
345
+ if (key_exists ($ funcName , $ F_SINK_ALL )){
346
+ for ($ i = 0 ;$ i < $ nameNum ; $ i ++){
347
+ if (key_exists ($ funcName , $ F_SINK_ARRAY [$ i ])){
348
+ return array (true ,$ F_SINK_ARRAY [$ i ][$ funcName ][0 ]);
349
+ }
350
+ }
351
+ return array (false );
352
+ }
353
+
354
+ //如果是用户的sink
355
+ if (key_exists ($ funcName , $ U_SINK_ALL )){
356
+ foreach ($ userDefinedSink ->getAllSinkArray () as $ value ){
357
+ if (key_exists ($ funcName , $ value )){
358
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
359
+ }
360
+ }
361
+ return array (false ) ;
362
+ }
363
+ case 'XSS ' :
364
+ global $ F_XSS ;
365
+ //如果是系统的sink
366
+ if (key_exists ($ funcName , $ F_XSS )){
367
+ return array (true , $ F_XSS [$ funcName ][0 ]);
368
+ }
369
+ //如果是用户的sink
370
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_XSS ())){
371
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
372
+ }
373
+ return array (false ) ;
374
+ break ;
375
+ case 'SQLI ' :
376
+ global $ F_DATABASE ;
377
+ //如果是系统的sink
378
+ if (key_exists ($ funcName , $ F_DATABASE )){
379
+ return array (true , $ F_DATABASE [$ funcName ][0 ]);
380
+ }
381
+ //如果是用户的sink
382
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_DATABASE ())){
383
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
384
+ }
385
+ return array (false ) ;
386
+ break ;
387
+ case 'HTTP ' :
388
+ global $ F_HTTP_HEADER ;
389
+ //如果是系统的sink
390
+ if (key_exists ($ funcName , $ F_HTTP_HEADER )){
391
+ return array (true , $ F_HTTP_HEADER [$ funcName ][0 ]);
392
+ }
393
+ //如果是用户的sink
394
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_HTTP_HEADER ())){
395
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
396
+ }
397
+ return array (false ) ;
398
+ break ;
399
+ case 'CODE ' :
400
+ global $ F_CODE ;
401
+ //如果是系统的sink
402
+ if (key_exists ($ funcName , $ F_CODE )){
403
+ return array (true , $ F_CODE [$ funcName ][0 ]);
404
+ }
405
+ //如果是用户的sink
406
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_CODE ())){
407
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
408
+ }
409
+ return array (false ) ;
410
+ break ;
411
+ case 'EXEC ' :
412
+ global $ F_EXEC ;
413
+ //如果是系统的sink
414
+ if (key_exists ($ funcName , $ F_EXEC )){
415
+ return array (true , $ F_EXEC [$ funcName ][0 ]);
416
+ }
417
+ //如果是用户的sink
418
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_EXEC ())){
419
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
420
+ }
421
+ return array (false ) ;
422
+ break ;
423
+ case 'LDAP ' :
424
+ global $ F_LDAP ;
425
+ //如果是系统的sink
426
+ if (key_exists ($ funcName , $ F_LDAP )){
427
+ return array (true , $ F_LDAP [$ funcName ][0 ]);
428
+ }
429
+ //如果是用户的sink
430
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_LDAP ())){
431
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
432
+ }
433
+ return array (false ) ;
434
+ break ;
435
+ case 'INCLUDE ' :
436
+ global $ F_FILE_INCLUDE ;
437
+ //如果是系统的sink
438
+ if (key_exists ($ funcName , $ F_FILE_INCLUDE )){
439
+ return array (true , $ F_FILE_INCLUDE [$ funcName ][0 ]);
440
+ }
441
+ //如果是用户的sink
442
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_FILE_INCLUDE ())){
443
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
444
+ }
445
+ return array (false ) ;
446
+ break ;
447
+ case 'FILE ' :
448
+ global $ F_FILE_READ ;
449
+ //如果是系统的sink
450
+ if (key_exists ($ funcName , $ F_FILE_READ )){
451
+ return array (true , $ F_FILE_READ [$ funcName ][0 ]);
452
+ }
453
+ //如果是用户的sink
454
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_FILE_READ ())){
455
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
456
+ }
457
+ return array (false ) ;
458
+ break ;
459
+ case 'XPATH ' :
460
+ global $ F_XPATH ;
461
+ //如果是系统的sink
462
+ if (key_exists ($ funcName , $ F_XPATH )){
463
+ return array (true , $ F_XPATH [$ funcName ][0 ]);
464
+ }
465
+ //如果是用户的sink
466
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_XPATH ())){
467
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
468
+ }
469
+ return array (false ) ;
470
+ break ;
471
+ case 'FILEAFFECT ' :
472
+ global $ F_FILE_AFFECT ;
473
+ //如果是系统的sink
474
+ if (key_exists ($ funcName , $ F_FILE_AFFECT )){
475
+ return array (true , $ F_FILE_AFFECT [$ funcName ][0 ]);
476
+ }
477
+ //如果是用户的sink
478
+ if (key_exists ($ funcName , $ userDefinedSink ->getF_FILE_AFFECT ())){
479
+ return array (true ,$ U_SINK_ALL [$ funcName ]) ;
480
+ }
481
+ return array (false ) ;
482
+ break ;
360
483
}
361
-
362
484
return array (false );
363
485
364
486
}
0 commit comments