a栋';简单';php url代理

a栋';简单';php url代理,php,proxy,php4,proxy-classes,Php,Proxy,Php4,Proxy Classes,我需要在我正在构建的web应用程序中实现一个简单的PHP代理(其基于flash且目标服务提供商不允许编辑其crossdomain.xml文件) 任何php大师都能就以下两个选项提供建议吗?此外,我认为,但不确定,我需要包括一些标题信息以及 谢谢你的反馈 选择1 $url = $_GET['path']; readfile($path); 选择2 $content .= file_get_contents($_GET['path']); if ($content !== false)

我需要在我正在构建的web应用程序中实现一个简单的PHP代理(其基于flash且目标服务提供商不允许编辑其crossdomain.xml文件)

任何php大师都能就以下两个选项提供建议吗?此外,我认为,但不确定,我需要包括一些标题信息以及

谢谢你的反馈

选择1

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

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

 if ($content !== false) 
 {  

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

首先,永远不要只根据用户输入包含文件。想象一下如果有人这样称呼你的脚本会发生什么:

然后讨论问题:您代理的是什么类型的数据?如果有任何类型,那么您需要从内容中检测内容类型,并将其传递给接收端,以便接收端知道它得到了什么。如果可能的话,我建议使用HTTP_Request2或Pear中类似的东西(参见:)。如果您可以访问它,则可以执行以下操作:

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

请注意,此代码尚未经过测试,这只是给您一个起点。

首先,永远不要包含仅基于用户输入的文件。想象一下如果有人这样称呼你的脚本会发生什么:

然后讨论问题:您代理的是什么类型的数据?如果有任何类型,那么您需要从内容中检测内容类型,并将其传递给接收端,以便接收端知道它得到了什么。如果可能的话,我建议使用HTTP_Request2或Pear中类似的东西(参见:)。如果您可以访问它,则可以执行以下操作:

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

请注意,此代码尚未经过测试,这只是给您一个起点。

这里是使用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;
}

下面是另一个使用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;
}

哇。我想我的眼睛受伤了。请转义
$\u GET
parameter.Woah。我想我的眼睛受伤了。请转义
$\u GET
参数。非常感谢您的反馈!!将作为一个起点,让你知道它是如何进行的。我不是一个php程序员,但我认为有很多情况需要这种类型的代理…我发现了一个语法错误,在if(!…行中缺少一个右括号,我还发现需要在我的服务器上安装一个缺少的HTTP_Request2 php类。您正在使用
新的HTTP_Request2($\u GET['path'))“
。这是否有一些内部验证,或者您是否也应该添加类似的内容。弗兰兹:首先使用preg_match对路径进行求值,以查看它是否真的是URL,请参阅脚本的第一行。我只想指出,正则表达式应该以“^”开头,以将其锚定到字符串的开头,否则会有人仍然可以读取文件,方法是将“http”部分隐藏在文件名末尾附近(可能在“:”或空格之后)。非常感谢您的反馈!!我将作为一个起点,让您知道它是如何运行的。我不是php程序员,但我认为有很多情况需要这种类型的代理…我只发现了一个语法错误,在if上缺少一个右括号(!..行,我还发现需要在我的服务器上安装一个缺失的HTTP_Request2 php类。您正在使用
new HTTP_Request2($\u GET['path'))“
。这是否有一些内部验证,或者您是否也应该添加类似的内容。弗兰兹:首先使用preg_match对路径进行求值,以查看它是否真的是URL,请参阅脚本的第一行。我只想指出,正则表达式应该以“^”开头,以将其锚定到字符串的开头,否则会有人仍然可以读取文件,方法是将“http”部分隐藏在文件名末尾附近的某个位置(可能在“:”或空格之后)。