Понимание, почему прокси не запрещают доступ с 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.