создание «простого» php URL-прокси - PullRequest
1 голос
/ 20 января 2010

Мне нужно внедрить простой прокси-сервер PHP в веб-приложении, которое я создаю (оно основано на флэш-памяти, и поставщик услуг назначения не разрешает вносить изменения в свой файл crossdomain.xml)

Может ли любой php-гуру дать совет по следующим 2 вариантам? Кроме того, я думаю, но не уверен, что мне нужно также включить некоторую информацию заголовка.

Спасибо за любые отзывы!

option1

$url = $_GET['path'];
readfile($path);

option2

 $content .= file_get_contents($_GET['path']);

 if ($content !== false) 
 {  

      echo($content);
 } 
 else 
 {  
      // there was an error
 }

Ответы [ 2 ]

5 голосов
/ 20 января 2010

Прежде всего, никогда не включайте файл, основанный только на пользовательском вводе. Представьте, что произойдет, если кто-то назовет ваш сценарий так:

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();

Обратите внимание, что этот код не был проверен, это просто для того, чтобы дать вам отправную точку.

0 голосов
/ 21 января 2010

Вот еще одно решение с использованием curl Кто-нибудь может прокомментировать ??

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