Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
| Total | |
88.24% |
15 / 17 |
|
50.00% |
1 / 2 |
CRAP | |
0.00% |
0 / 1 |
| PathValidator | |
88.24% |
15 / 17 |
|
50.00% |
1 / 2 |
10.16 | |
0.00% |
0 / 1 |
| checkPath | |
100.00% |
12 / 12 |
|
100.00% |
1 / 1 |
7 | |||
| checkFilePathIsRegularFile | |
60.00% |
3 / 5 |
|
0.00% |
0 / 1 |
3.58 | |||
| 1 | <?php |
| 2 | |
| 3 | namespace FileUtil; |
| 4 | |
| 5 | use FileUtil\FileExists; |
| 6 | |
| 7 | /** |
| 8 | * |
| 9 | * |
| 10 | * @package FileUtil |
| 11 | * @author Bjørn Rosell <it@rosell.dk> |
| 12 | */ |
| 13 | class PathValidator |
| 14 | { |
| 15 | /** |
| 16 | * Check if path looks valid and doesn't contain suspecious patterns. |
| 17 | |
| 18 | * The path must meet the following criteria: |
| 19 | * |
| 20 | * - It must be a string |
| 21 | * - No NUL character |
| 22 | * - No control characters between 0-20 |
| 23 | * - No phar stream wrapper |
| 24 | * - No php stream wrapper |
| 25 | * - No glob stream wrapper |
| 26 | * - Not empty path |
| 27 | * |
| 28 | * @throws \Exception In case the path doesn't meet all criteria |
| 29 | */ |
| 30 | public static function checkPath($path) |
| 31 | { |
| 32 | if (gettype($path) !== 'string') { |
| 33 | throw new \Exception('File path must be string'); |
| 34 | } |
| 35 | if (strpos($path, chr(0)) !== false) { |
| 36 | throw new \Exception('NUL character is not allowed in file path!'); |
| 37 | } |
| 38 | if (preg_match('#[\x{0}-\x{1f}]#', $path)) { |
| 39 | // prevents line feed, new line, tab, charater return, tab, ets. |
| 40 | throw new \Exception('Control characters #0-#20 not allowed in file path!'); |
| 41 | } |
| 42 | // Prevent phar stream wrappers (security threat) |
| 43 | if (preg_match('#^phar://#', $path)) { |
| 44 | throw new \Exception('phar stream wrappers are not allowed in file path'); |
| 45 | } |
| 46 | if (preg_match('#^(php|glob)://#', $path)) { |
| 47 | throw new \Exception('php and glob stream wrappers are not allowed in file path'); |
| 48 | } |
| 49 | if (empty($path)) { |
| 50 | throw new \Exception('File path is empty!'); |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | /** |
| 55 | * Check if path points to a regular file (and doesnt match suspecious patterns). |
| 56 | * |
| 57 | * @throws \Exception In case the path doesn't point to a regular file or matches suspecious patterns |
| 58 | */ |
| 59 | public static function checkFilePathIsRegularFile($path) |
| 60 | { |
| 61 | self::checkPath($path); |
| 62 | |
| 63 | if (!FileExists::fileExists($path)) { |
| 64 | throw new \Exception('File does not exist'); |
| 65 | } |
| 66 | if (@is_dir($path)) { |
| 67 | throw new \Exception('Expected a regular file, not a dir'); |
| 68 | } |
| 69 | } |
| 70 | } |