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.0.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;
	}

	// `../` ,які не трапляються наприкінці path is not allowed:
	if ( false !== strpos( $file, '../' ) && '../' !== mb_substr( $file, -3, 3 ) ) {
		return 1;
	}

	// Files not 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;
}