Как не разрешить cURL в PHP доступ к локальным адресам? - PullRequest
0 голосов
/ 29 февраля 2020

Я установил онлайн php curl http header retriever.

Как это работает:
Пользователь переходит на URL https://www.example.com/header/, затем ввод поле, в котором пользователь может ввести доменное имя. И нажмите Отправить. Затем PHP использует curl для получения http-заголовков сайта. Он извлекает заголовки из того, что там введено, только если веб-сайт работает, если нет, он ждет 5 секунд и закрывает соединение. Если URL-адрес недействителен, curl не выполняется (PHP использует регулярное выражение для его получения).

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

Используемые опции cURL:

curl_setopt($ch, CURLOPT_URL, $domain);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
//Is there any option I could use to not allow local network connection?

Редактировать

На всякий случай проще, если у вас есть весь код:

<code><form action="" method="get">
<p><b><label for="domain">Domain/IP Address:</label></b> <input type="text" name="url" id="url" value="<?=htmlentities($_GET["url"], ENT_QUOTES);?>"> <input type="submit" class="btn home" value="Lookup"></p>
</form>
<?php
$domain = htmlentities($_GET["url"], ENT_QUOTES);

$ch = curl_init();

// set url
curl_setopt($ch, CURLOPT_URL, $domain);

//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//enable headers
curl_setopt($ch, CURLOPT_HEADER, 1);
//get only headers
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
// $output contains the output string
$output = htmlentities(curl_exec($ch), ENT_QUOTES);
$curlinfo = curl_getinfo($ch);

// close curl resource to free up system resources
curl_close($ch);

if($domain) {
    if (!preg_match("~^(?:f|ht)tps?://~i", $domain)) { 

        // If not exist then add http 
        $domain = "http://" . $domain; 
    } 
    if (filter_var($domain, FILTER_VALIDATE_URL)) {
        $result = $output;
        echo "<div id='result'>";
        if (trim($result) != "") {
        echo "<pre style='background-color: #EEEEEE; overflow: auto;'><b>\n" . $result . "\n</b>
\ n "; echo" Взял ". $ Curlinfo [" total_time "]." Seconds. ";} Else {echo" Не удалось получить сайт. Это может быть связано с тем, что загрузка веб-сайта занимает более 5 секунд или веб-сайт не существует.";} echo"";} else {echo" Invalid Domain / IP! ";}}?>

Ответы [ 2 ]

1 голос
/ 29 февраля 2020

Сначала используйте parse_url, чтобы получить имя хоста из полного URL-адреса

$host = parse_url( $domain, PHP_URL_HOST );

Затем используйте gethostbyname, чтобы получить адрес IPv4, соответствующий указанный Inte rnet имя хоста

$ip = gethostbyname( $host );

Наконец, проверьте, попадает ли IP-адрес в диапазоны IP-адресов частной сети

// split ip into its components

$ip = explode( '.', $ip );

// check for private addresses

$local_network = ( $ip[0] == 10 ) ||
                 ( $ip[0] == 192 && $ip[1] == 168 ) ||
                 ( $ip[0] == 172 && $ip[1] >= 16 && $ip[1] <= 31 );

if( $local_network )
{
    // manage access to local network...
}
0 голосов
/ 29 февраля 2020

Возможно, добавьте тест как if ($_GET['url'] == "localhost") {//give an error} перед тем, как "построить" локон.

...