WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

validate_file()WP 1.2.0

Проверяет переданную строку, является ли она правильным путем к файлу (имени файла). Если проверка пройдена, вернет 0; если нет, вернет: 1, 2 или 3.

Используется для предотвращения Directory traversal атак.

Основа для: wp_get_active_and_valid_plugins()
1 раз — 0.000018 сек (очень быстро) | 50000 раз — 0.01 сек (скорость света) | PHP 7.1.2, WP 4.7.5

Хуков нет.

Возвращает

int.

  • 0 - проверка пройдена;
  • 1 - означает что файл содержит ../ (Перейти в родительскую директорию). Что, переданное команде, может позволить читать/изменять файлы в родительских директориях — что неприемлемо с точки зрения безопасности;
  • 2 - означает что $file содержит : вторым символом (Диск для Windows; абсолютный путь). Неприемлемо по тем же причинам;
  • 3 - означает что файла нет в списке допустимых, указанных в параметре $allowed_files.

Использование

validate_file( $file, $allowed_files );
$file(строка) (обязательный)
Путь до файла.
$allowed_files(массив)
Список допустимых файлов, которым должна соответствовать переменная $file.
По умолчанию: ''

Примеры

0

#1 Демонстрация проверок пути файлов

Путь, который пройдет проверку:

$path = 'uploads/2012/12/my_image.jpg';
echo validate_file( $path ); // выведет 0 (допустимый путь)

Путь, который не пройдет проверку:

$path = '../../wp-content/uploads/2012/12/my_image.jpg';
echo validate_file( $path ); // выведет 1 (недоступный путь)

Заметки

Будьте внимательны при проверке возвращаемого результата, т.к. если проверка пройдена, то функция вернет 0, а если не пройдена то вернет число. Поэтому проверять стоит как-то так:

if( validate_file( $file ) === 0 )
	echo 'проверка пройдена';
else
	echo 'проверка не пройдена';

Список изменений

С версии 1.2.0 Введена.

Код validate_file() WP 6.5.2

function validate_file( $file, $allowed_files = array() ) {
	if ( ! is_scalar( $file ) || '' === $file ) {
		return 0;
	}

	// `../` on its own is not allowed:
	if ( '../' === $file ) {
		return 1;
	}

	// More than one occurrence of `../` is not allowed:
	if ( preg_match_all( '#\.\./#', $file, $matches, PREG_SET_ORDER ) && ( count( $matches ) > 1 ) ) {
		return 1;
	}

	// `../` which does not occur at the end of the path is not allowed:
	if ( str_contains( $file, '../' ) && '../' !== mb_substr( $file, -3, 3 ) ) {
		return 1;
	}

	// Files not in the allowed file list are not allowed:
	if ( ! empty( $allowed_files ) && ! in_array( $file, $allowed_files, true ) ) {
		return 3;
	}

	// Absolute Windows drive paths are not allowed:
	if ( ':' === substr( $file, 1, 1 ) ) {
		return 2;
	}

	return 0;
}
3 комментария
    Войти