Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
88.24% covered (warning)
88.24%
15 / 17
50.00% covered (danger)
50.00%
1 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
PathValidator
88.24% covered (warning)
88.24%
15 / 17
50.00% covered (danger)
50.00%
1 / 2
10.16
0.00% covered (danger)
0.00%
0 / 1
 checkPath
100.00% covered (success)
100.00%
12 / 12
100.00% covered (success)
100.00%
1 / 1
7
 checkFilePathIsRegularFile
60.00% covered (warning)
60.00%
3 / 5
0.00% covered (danger)
0.00%
0 / 1
3.58
1<?php
2
3namespace FileUtil;
4
5use FileUtil\FileExists;
6
7/**
8 *
9 *
10 * @package    FileUtil
11 * @author     Bjørn Rosell <it@rosell.dk>
12 */
13class 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}