За последние 24 часа нас посетили 54820 программистов и 1720 роботов. Сейчас ищут 895 программистов ...

Запрет php-скриптам делать include с внешних URL

Тема в разделе "Прочие вопросы по PHP", создана пользователем EskanderDon, 27 сен 2015.

  1. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    Доброго времени суток, Ув.Форумчане!

    Как запретить полностью запретить подключение к внешним URL для php-скриптов?

    Суть проблемы в том, что в файле php.ini стоит настройка безопасности, которая
    запрещает делать вроде
    Код (PHP):
    1. $url = 'http://www.yandex.ru';
    2. include_once($url); 
    Строчки из php.ini отвечающие за данную настройку:
    Код (PHP):
    1. allow_url_fopen = Off
    2. allow_url_include = Off
    если директива в php.ini включена то получим сообщение - Warning: include_once() [function.include-once]: URL file-access is disabled in the server configuration in G:\www\sitename.ru\index.php on line ...

    Однако данная директива не решает проблемы из-за возможности её обойти, благодаря включённым в последних версиях функции, которая благодаря такому функцию, позволяет вывести содержимое полученное от внешнего URL, прим:
    Код (PHP):
    1. $url = 'http://www.yandex.ru';
    2. include_once($url);
    3. function file_get_contents_curl($url) {
    4.     $ch = curl_init();
    5.  
    6.     curl_setopt($ch, CURLOPT_HEADER, 0);
    7.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    8.     curl_setopt($ch, CURLOPT_URL, $url);
    9.  
    10.     $data = curl_exec($ch);
    11.     curl_close($ch);
    12.  
    13.     return $data;
    14. }
    15. echo file_get_contents_curl($url); 
    В некоторых CMS существует, что-то аналогичное, видимо для подгрузки новостной ленты, что приводит порой к подвисаниям и задержкам в работе сайта.

    Я бы хотел узнать, возможно ли выставление какой-нибудь более строгой директивы для запрета включения php-скриптам с внешнего URL-а данных - в php.ini, httpd.conf ... ? Сразу скажу, что лапатить весь код ради поиска "инъекций" не представляется возможным. Есть вообще какие-нибудь приемлемые варианты?

    .

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Может я что то путаю (зубной надомной не плохо поработал) но вроде как include и file_get_contents (file_get_contents_curl в curl) это разные вещи, в смысле делают разные штуки.
    include подключает файл для его дальнейшего использования.
    file_get_contents получает содержимое файла (или результат выполнения скрипта) в виде простого текста.
     
  3. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    Ничего не путаете. Функции действительно различные.
    А зачем об этом рассуждать?! Рассуждения в данном ключе не суть вопроса...

    Пример с кодам показывает, возможность обхода директивы allow_url_fopen / allow_url_include

    Надо разобраться как отключить возможность скриптов, которые затесались (или могут затесаться) подключаться к внешним источникам.

    Есть доступ к файлам конфигурации. Отследить место скрипта тоже "вариант", но если подключения будут происходить от случая к случаю...

    Если скрипт попал в папку сервера - «то пусть в ней и "варится", нечего по чужим хатам соль собирать»
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    так file_get_contents (file_get_contents_curl в curl) он и создан для того, что бы получать контент удаленных страницы, хотя может и внутренних.
     
  5. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    ... это всё понятно. Я бы сделал акцент не на второстепенных деталях, а на теме.
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну если ненужен curl то отключить его. и делов то

    Добавлено спустя 2 минуты 6 секунд:
    еще есть disable_functions и disable_classes
     
  7. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    Интересный вариант. Надо протестировать. Интересно посмотреть: будет ли глючить движок или нет ... :)
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Код из сети можно загрузить с помощью fsockopen(), расширения socket и вызова системных утилит вроде:
    в данном примере, curl не связан с php и отключение в php не повлияет на работу утилиты.

    Даже если вы примите все возможные меры на сервере, это не спасет вас от возможности попадания в страницу вашего сайта javascript-кода, который сделает ajax-запрос или подгрузит другим способом php-код откуда-нибудь, и отправит этот код специальному php-скрипту на вашем сайте.

    Иначе говоря, если вы устанавливаете скрипт из ненадежного источника, то вы больше не можете быть уверены в безопасности ни капельки.
     
  9. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    Кстати: директива disable_functions в php.ini никакого эффекта не имеет - "вообще ноль реакции". В оф.документации сказано, что в режиме Safe Mode она не работает. Хотя я честно сказать сомневаюсь, что у меня стоит данный режим..
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Кому-то пора прокачать навык настройки сервера.
     
  11. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    Я только За! Но всё приходит с опытом.. С горьким личным опытом..
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    интересно, можно ли юзеру или процессу запретить любую сетевую активность, кроме юниксовых сокетов? Это бы решило вопрос.
     
  13. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    у меня сервер на Windows, можно сделать, чтобы файрволл брал на себя функцию, так и получается: когда php-скрипт пытается вытащить инфу из глобальной сети, то файрволл пищит.. у такого костыля есть массу недостатков, к примеру это может привести как зависанию движка CMS.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ой,тогда хз, это ужас держать сервер на пхп на винде. Уж лучше виртуалку поднять.
     
  15. EskanderDon

    EskanderDon Новичок

    С нами с:
    27 сен 2015
    Сообщения:
    8
    Симпатии:
    0
    :D - Вы ж предлагали повысить навыки по настройке сервака до +999 уровня. Винда это самое - то что и надо.
    А unix-подобные системы тоже не панацея. Повелось как то, что мол: «Раз под юникс писалось, то и пахать на нём будет как часики». Времена не те уже. Сейчас уже понятия модульности, инкапсуляции есть..
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    по настройке сервака для пхп. Это линух.
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    В винде сервер можно все. Можно определить пользователя для пхп и в локальных политиках запретить сеть. Работать надо под IIS. Точно можно, но я не знаю как (