Надежный вызов ping6 из php

226
10 мая 2018, 06:18

Для IPv4 есть Net_ping.

Для IPv6 получается только это:

$ipv6 = "";
exec("ping6  $ipv6", $output, $status);
print_r($output);

Но это же, сами понимаете, что получается, даже если сделать: escapeshellcmd($ipv6).

Вопрос: Есть какой-нибудь надежный метод пинговать IPv6 из PHP скрипта?

Answer 1

Если Вас смущает незавершаемость процесса - можете воспользоваться флагом -c count, чтобы ограничить число пинг-запросов.

ping6 -c 1 example.com  

По поводу экранирования - нужно использовать escapeshellarg, а не escapeshellcmd:

$cmd = 'ping6 -c1 ' . escapeshellarg($ipv6);

Это не серебрянная пуля, у функции есть масса низкоуровневых проблем:

  • Заприваченный более 4х лет назад баг.
  • Не работает в Win. баг 2009г.
  • Обработка локалей. баг
  • Альтернативные шеллы. баг

Можно обезопасить себя(не специалист, никаких гарантий), предварительно ограничив возможные некорректные символы:

if (!preg_match('/\A[-_.@\pN\pL]+\z/ui', $ipv6)) throw new \Exception('Bad domain'); // \pN - числовые символы, \pL - буквенные

Можно также реализовать функцию пинга самостоятельно, через ICMP

function ping($host, $timeout = 1, $ipv6 = false) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket  = socket_create($ipv6 ? AF_INET6 : AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $host, null);
    $ts = microtime(true);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {
        $result = microtime(true) - $ts;
    } else {
        $result = false;
    }
    socket_close($socket);
    return $result;
}

Использован ответ

READ ALSO
homestead-laravel. PHPmyAdmin

homestead-laravel. PHPmyAdmin

Провозился с Homestead очень многоСмог в конце разобраться

249
Не заносятся данные таблицу MySQL

Не заносятся данные таблицу MySQL

Весь код ниже работает кроме последней строкиВсе переменные выводятся правильно, но не заносятся в БД

207
Плагин FullPage при адаптивности [требует правки]

Плагин FullPage при адаптивности [требует правки]

Помогите отключить плагин прокрутки fullpage по секциям при мобильном виде

244
Javascript не работает на мобильном телефоне

Javascript не работает на мобильном телефоне

Разрабатываю крупный проект на Laravel со связкой чистый JS + jQueryВ браузере все работает, в целом, как и ожидается, но проблемы начинаются при переходе...

253