Функция validate_file()
проверяет путь к файлу и имя файла на предмет допустимости, помогая предотвратить атаки с использованием обхода директорий (Directory Traversal). Она возвращает различные коды в зависимости от типа ошибки, либо 0, если путь считается безопасным.
validate_file( string $file, string[] $allowed_files = array() ): int
Параметры
- $file (строка, обязательный) — Путь или имя файла, который необходимо проверить.
- $allowed_files (массив строк, необязательный) — Список допустимых файлов. Если файл не входит в этот список, функция вернет ошибку.
Возвращаемое значение
Функция возвращает одно из следующих значений:
0
— Путь корректен и не содержит запрещенных символов.1
— Путь содержит../
, что указывает на попытку перехода в родительскую директорию (Directory Traversal).2
— Путь содержит символ:
во втором символе строки, что может указывать на абсолютный путь в Windows.3
— Путь не входит в массив допустимых файлов, указанных в$allowed_files
.
Как работает функция
Функция validate_file()
необходима для проверки безопасности пути и предотвращения несанкционированного доступа к файлам вне разрешенных директорий. Она особенно полезна при работе с пользовательскими загрузками, где важно избежать манипуляций с путями.
Пример 1: Проверка допустимого пути к файлу
Этот пример демонстрирует проверку допустимого пути, который не содержит подозрительных символов или запрещенных переходов.
$file_path = 'uploads/2024/10/photo.jpg';
$result = validate_file( $file_path );
if ( $result === 0 ) {
echo 'Путь к файлу допустим.';
} else {
echo 'Недопустимый путь.';
}
// Результат: Путь к файлу допустим.
Поскольку путь uploads/2024/10/photo.jpg
безопасен и не содержит запрещенных символов, функция возвращает 0
, что указывает на допустимость пути.
Пример 2: Проверка пути с запрещенным переходом в родительскую директорию
Здесь путь содержит ../
, что может привести к доступу к родительским директориям, поэтому функция возвращает 1
.
$file_path = '../../wp-content/uploads/2024/10/photo.jpg';
$result = validate_file( $file_path );
if ( $result === 1 ) {
echo 'Ошибка: путь содержит недопустимый переход в родительскую директорию.';
} else {
echo 'Путь допустим.';
}
// Результат: Ошибка: путь содержит недопустимый переход в родительскую директорию.
Путь содержит ../
, и функция возвращает 1
, сигнализируя об угрозе безопасности.
Пример 3: Проверка пути с указанием диска в формате Windows
В этом примере путь начинается с C:
, что недопустимо, так как это указывает на абсолютный путь в Windows.
$file_path = 'C:/xampp/htdocs/wp-content/uploads/photo.jpg';
$result = validate_file( $file_path );
if ( $result === 2 ) {
echo 'Ошибка: путь содержит указание диска, что недопустимо.';
} else {
echo 'Путь допустим.';
}
// Результат: Ошибка: путь содержит указание диска, что недопустимо.
Путь содержит символ :
, и функция возвращает 2
, так как это может быть указанием на диск в Windows.
Пример 4: Проверка файла на соответствие списку разрешенных
Если путь к файлу не входит в список разрешенных, функция вернет 3
.
$file_path = 'uploads/2024/10/photo.jpg';
$allowed_files = ['uploads/2024/10/image1.jpg', 'uploads/2024/10/image2.jpg'];
$result = validate_file( $file_path, $allowed_files );
if ( $result === 3 ) {
echo 'Ошибка: путь к файлу не входит в список разрешенных.';
} else {
echo 'Путь допустим.';
}
// Результат: Ошибка: путь к файлу не входит в список разрешенных.
Поскольку photo.jpg
не включен в массив $allowed_files
, функция возвращает 3
.
Замечания по использованию
Функция возвращает 0
только в случае безопасного пути, что делает проверку простой: достаточно сравнить результат с 0
, чтобы понять, прошла ли проверка.
$file_path = 'uploads/2024/10/photo.jpg';
if ( validate_file( $file_path ) === 0 ) {
echo 'Путь корректен.';
} else {
echo 'Путь небезопасен.';
}
Заключение
Функция validate_file()
— это мощный инструмент для проверки пути к файлу и предотвращения атак с использованием обхода директорий. Она помогает разработчикам WordPress защитить загрузки файлов и другие операции с файлами от потенциальных угроз.