Несколько лет назад я отправил ответ на вопрос о способе, в PHP, чтобы позволить пользователю передать в URI относительный путь к файлу для загрузки, предотвращая обход каталога.
У меня появилось несколько комментариев, в которых говорится, что код небезопасен, и несколько downvotes (последнее из сегодняшних событий). Здесь код:
$path = $_GET['path'];
if (strpos($path, '../') !== false ||
strpos($path, "..\\") !== false ||
strpos($path, '/..') !== false ||
strpos($path, '\..') !== false)
{
// Strange things happening.
}
else
{
// The request is probably safe.
if (file_exists(dirname(__FILE__) . DIRECTORY_SEPARATOR . $path))
{
// Send the file.
}
else
{
// Handle the case where the file doesn't exist.
}
}
Я снова и снова просматривал код, тестировал его и до сих пор не понимаю, что представляет собой проблема безопасности.
Единственный намек, который я получил в комментариях, заключается в том, что ../
можно заменить на %2e%2e%2f
. Это не проблема, так как PHP автоматически преобразует ее в ../
.
В чем проблема с этим фрагментом кода? Каким может быть значение ввода, которое могло бы позволить обход каталога или что-то сломать?