Встроенный сервер PHP не может взломать

У меня есть относительно простой скрипт, подобный следующему:

<?php
$url = "localhost:2222/test.html";

echo "*** URL ***\n";
echo $url . "\n";
echo "***********\n";
echo "** whoami *\n";
echo exec('whoami');
echo "* Output **\n";

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$output = curl_exec($ch); 

curl_close($ch);

echo $output;

Когда я выполняю его в командной строке, он работает - я получаю скудные результаты из test.html.

Когда я запускаю этот скрипт, загружая встроенный сервер PHP и просматривая его, он зависает. Нет вывода на экран, ничего не записано в журналах.

Я читал, что иногда могут мешать пользовательские разрешения, поэтому я попытался сделать whoami, чтобы убедиться, что пользователь, запустивший встроенный сервер PHP, совпадает с пользователем, который выполнил сценарий в командной строке; которые они есть.

safe_mode выключен, disable_functions установлен в ноль. Я могу успешно выполнить другие команды (например, whoami).

Что еще я должен проверить? Может ли встроенный сервер PHP считаться кем-то другим, когда он выполняет запрос?

3 ответа

Решение

Чтобы сделать комментарий ответом: встроенный веб-сервер разработки PHP - это очень простой однопоточный тестовый сервер. Он не может обрабатывать два запроса одновременно. Вы пытаетесь получить файл из себя в отдельном запросе, поэтому вы попали в тупик. Первый запрос ожидает завершения второго, но второй запрос не может быть обработан, пока первый еще выполняется.

Начиная с PHP 7.4 переменная окружения PHP_CLI_SERVER_WORKERSпозволяет выполнять одновременные запросы , создавая несколько рабочих процессов PHP на одном и том же порту встроенного веб-сервера. Он считается экспериментальным, см . документы .

Используя его, PHP-скрипт может отправлять запросы самому себе, которые уже обслуживаются, не останавливаясь.

      PHP_CLI_SERVER_WORKERS=10 php -S ...

Работает и с Laravel:

      PHP_CLI_SERVER_WORKERS=10 php artisan serve

Я думаю проблема в вашем $url. Это может выглядеть так: $ url = " http://localhost:2222/test.html"; или $ url = " http://localhost/test.html"; Я думаю, что это решит вашу проблему. Спасибо за ваш вопрос. Удачи.

Другие вопросы по тегам