Мне нужно реализовать простой PHP-прокси в веб-приложении, которое я создаю (его флеш-интерфейс и поставщик услуг назначения не разрешают редактировать их файл crossdomain.xml)
Могут ли любые php-гуру дать рекомендации по следующим двум вариантам? Кроме того, я думаю, но не уверен, что мне нужно также включить информацию о заголовке.
Спасибо за любую обратную связь!
Опция 1
$url = $_GET['path']; readfile($path);
option2
$content .= file_get_contents($_GET['path']); if ($content !== false) { echo($content); } else { // there was an error }
Прежде всего, никогда не включайте файл, основанный только на пользовательском вводе. Представьте, что произойдет, если кто-нибудь вызовет ваш скрипт следующим образом:
http://example.com/proxy.php?path=/etc/passwd
Затем на вопрос: какие данные вы проксируете? Если какой-либо вид вообще, то вам нужно определить тип контента из контента и передать его, чтобы получающий конец знал, что он получает. Я бы предложил использовать что-то вроде HTTP_Request2 или что-то похожее на Pear (см. http://pear.php.net/package/HTTP_Request2 ), если это вообще возможно. Если у вас есть доступ к нему, вы можете сделать что-то вроде этого:
// First validate that the request is to an actual web address if(!preg_match("#^https?://#", $_GET['path']) { header("HTTP/1.1 404 Not found"); echo "Content not found, bad URL!"; exit(); } // Make the request $req = new HTTP_Request2($_GET['path']); $response = $req->send(); // Output the content-type header and use the content-type of the original file header("Content-type: " . $response->getHeader("Content-type")); // And provide the file body echo $response->getBody();
Обратите внимание, что этот код не был протестирован, это только для того, чтобы дать вам отправную точку.
Вот еще одно решение, использующее завиток. Кто-нибудь может комментировать ???
$ch = curl_init(); $timeout = 30; $userAgent = $_SERVER['HTTP_USER_AGENT']; curl_setopt($ch, CURLOPT_URL, $_REQUEST['url']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch, CURLOPT_USERAGENT, $userAgent); $response = curl_exec($ch); if (curl_errno($ch)) { echo curl_error($ch); } else { curl_close($ch); echo $response; }