1

我的代理有很多限制,例如:无法访问 youtube、facebook 和许多其他网站,这些是公司政策。

但是在 PHP 中测试代码我发现我可以使用它访问任何站点:

<!doctype html>  
<html lang="en">  
    <head>  
        <meta charset="utf-8">  
        <title>Web Proxy</title> 
    </head> 
    <body> 
        <div style="text-align:center;"> 
            <form method="GET" action="<?=$_SERVER['REQUEST_URI']?>"> 
                <input type="url" name="url" placeholder="Type URL of site"/><input type="submit" Value="Load url" /> 
            </form> 
        </div> 
        <hr/> 
        <?php 
            $url = $_GET['url']; 
            if (!empty($url)) 
            { 
                // check we're only getting files served by a website (i.e. not ../../../passwords.txt from this server etc.)  
                if(preg_match('/^https?:/i', $url))   
                {  
                    $contents = file_get_contents($url);  
                    if($contents === FALSE)  
                    {  
                        echo "<h2>Sorry <pre>{$url}</pre> cannot be read</h2>\n";  
                    }  
                    //display contents of url  
                    else   
                    { ?>  
                        <?=$contents?>  
                        <script>for (var i=0; i<document.links.length; i++) document.links[i].href="<?=$_SERVER['PHP_SELF']?>?url="+document.links[i].href;</script>  
                    <?php }  
                }  
                else  
                {  
                    echo "<h2><pre>$url</pre> is an invalid URL</h2>\n";  
                }  
            }  
        ?>  
    </body>  
</html>  

我只是想了解此代码如何处理忽略代理策略的任何站点?我可以不受限制地访问所有内容。有人可以向我解释“幕后”的概念吗?

4

1 回答 1

2

PHP 是一种服务器端脚本语言。

因此,与由浏览器执行的 HTML/CSS/JS 不同,PHP 将首先由服务器解释,然后只有脚本运行后的结果才会发送到您的计算机/浏览器。

这意味着 file_get_contents 将在您的 PHP 脚本所在的服务器上执行。如果托管该 PHP 文件的服务器也不在您公司代理的后面,那么代理将不会影响它。

实际上,这意味着服务器将首先下载您尝试访问的网页,然后将结果放入脚本页面。您的浏览器/计算机永远不会真正访问 $url 页面,只有服务器会。

示例:Youtube.com

  • 通常:代理看到您的计算机/浏览器尝试访问 Youtube.com 并且不允许您访问
  • 在单独的服务器上通过 PHP 加载:公司外部某处的服务器托管脚本下载 youtube.com,服务器通过脚本页面向您发送数据。您的浏览器/计算机永远不会访问 youtube.com,只有外部服务器才能访问,代理看不到 youtube.com

编辑:因此,如果使用 HTML 框架/iframe 而不是 PHP,则代理仍将拒绝访问,因为 HTML 不是服务器端脚本语言。HTML 告诉您的浏览器该做什么,PHP 在让您的计算机/浏览器访问它之前告诉服务器该做什么。当使用 HTML 加载页面时,代理会看到加载 URL 请求,当使用 PHP 时,代理只会看到 PHP 页面 URL

于 2013-12-19T19:06:20.270 回答