Понимание, почему прокси не запрещают доступ с file_get_contents в PHP

У меня есть прокси с множеством ограничений, таких как: не могу получить доступ к 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>  

Я просто хочу понять, как этот код может обрабатывать любой сайт, игнорируя политики прокси? Я могу получить доступ ко всему без ограничений. Кто-то может объяснить мне понятие "за кадром"?

1 ответ

Решение

PHP - это серверный язык сценариев.

Таким образом, в отличие от HTML/CSS/JS, которые выполняются вашим браузером, PHP будет сначала интерпретироваться сервером, а затем только результаты после запуска скрипта будут отправляться на ваш компьютер / браузер.

Это означает, что file_get_contents будет выполняться на сервере, на котором включен ваш PHP-скрипт. Если сервер, на котором размещен этот PHP-файл, также не находится за прокси-серверами вашей компании, то прокси-серверы на него не влияют

Фактически это означает, что сервер сначала загрузит веб-страницу, к которой вы пытаетесь получить доступ, а затем поместит результаты на страницу скрипта. Ваш браузер / компьютер никогда не получит доступ к странице $ url, только сервер.

Пример: Youtube.com

  • Обычно: Прокси видит, что ваш компьютер / браузер пытается зайти на Youtube.com и не дает вам доступа
  • Загруженный через PHP на отдельном сервере: серверный скрипт размещения где-то за пределами компании скачивает youtube.com, сервер отправляет вам данные через страницу скрипта. Ваш браузер / компьютер никогда не заходит на youtube.com только внешний сервер, прокси не видит youtube.com

edit: Так что если бы вместо PHP использовался HTML-фрейм /iframe, прокси-сервер все равно отказывал бы в доступе, поскольку HTML не является языком сценариев на стороне сервера. HTML говорит вашему браузеру, что делать, PHP сообщает серверу, что делать, прежде чем разрешить вашему компьютеру / браузеру доступ к нему. Когда для загрузки страницы используется HTML, PROXY видит запрос на загрузку URL, а когда используется PHP, PROXY видит только URL страницы на PHP.

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