У нас есть пара разработчиков, которые просят включить allow_url_fopen на нашем сервере. Что является нормой в наши дни, и если libcurl включен, действительно ли есть какие-либо веские основания для этого?
Среда: Windows 2003, PHP 5.2.6, FastCGI






Вы определенно хотите, чтобы allow_url_include был отключен, что также снижает многие риски allow_url_fopen.
Но поскольку не все версии PHP имеют allow_url_include, для многих лучше всего отключить fopen. Как и все функции, реальность такова, что если она вам не нужна для вашего приложения, отключите ее. Если вам это действительно нужно, модуль curl, вероятно, может сделать это лучше, и рефакторинг вашего приложения для использования curl для отключения allow_url_fopen может отпугнуть наименее решительного взломщика.
Привет, Бен, я видел довольно много случаев, когда переменные передаются в include () (или fopen ()), которые, по мнению разработчика, ссылаются на локальный файл, но вместо этого они являются URL-адресами, ссылающимися на вредоносный PHP-код, хранящийся за пределами сайта. Я могу придумать несколько разумных причин, по которым кто-то может захотеть включить ("http: // .."), и, следовательно, реальная безопасность улучшается за счет отключения этой функции. См. en.wikipedia.org/wiki/Remote_File_Inclusion
@Ben James: Некоторое время назад нас взломали из-за падения безопасности в нашем современном коммерческом пакете форумов, а также в другом устаревшем программном обеспечении. Отключение allow_url_include и allow_url_fopen остановило почти каждую атаку.
Почему использование libcurl может быть безопаснее, чем использование file_get_contents (), если я загружаю тот же URL и использую данные таким же образом? Это то же самое. Так же, как использование libcurl и eval () для загруженного контента вовсе не безопаснее, чем использование include () внешнего URL-адреса. Это просто фальшивая «безопасность за счет раздражения», как Windows Vista дважды спрашивает вас, действительно ли вы действительно хотите запустить эту программу.
Так ли это до сих пор?
В ответ на вопрос «Почему использование libcurl может быть безопаснее, чем использование file_get_contents ()», дело в том, что код часто использует file_get_contents() для открытия локального файла, поэтому разрешение удаленного открытия приводит к вектору атаки, который относительно легко использовать (это просто берет одну необработанную переменную ...). Если вы используете знать, вы имеете дело с удаленным URL-адресом, тогда следует использовать cURL, и вы правы, в этом случае нет никакой разницы в последствиях для безопасности.
Атаки с использованием межсайтовых сценариев - это боль, так что это голосование против. И вам обязательно нужно выключить "allow_url_include", иначе вас ждет целый мир боли.
AFAIK это не имеет ничего общего с XSS, а с загрузкой локальных файлов.
Я думаю, ответ сводится к тому, насколько вы доверяете своим разработчикам ответственно использовать эту функцию? С данными из внешнего URL-адреса следует обращаться как с любым другим ненадежным вводом, и если это понятно, что в этом такого?
На мой взгляд, если вы относитесь к своим разработчикам как к детям и никогда не позволяете им заниматься острыми вещами, то у вас будут разработчики, которые никогда не осознают ответственность за написание безопасного кода.
Это зависит от типа застройки. Если ваше прототипирование, то включение allow_url_fopen - это нормально, однако существенной разницы в скорости между libcurl и file_get_contents нет, и включение этого параметра - только вопрос удобства.
Для производственных серверов любой вызов libcurl должен быть помечен для аудита безопасности. То же самое должно быть с fopen и file_get_contents, если 'allow_url_fopen' включен. Отключение allow_url_fopen не предотвращает эксплойтов, а лишь немного ограничивает количество способов, которыми они могут быть выполнены.
Большая проблема заключается в том, что allow_url_fopen не более защищен, поэтому, если вы хотите сохранить файл с URL-адреса с помощью curl, вы должны перейти из fopen / file_get, чтобы сохранить файл.
- CURL is only good to retrieve remote content from URL. (allow_url_fopen not necessary)
- CURL must be added with Fopen or File_get if you want to save remote file to your server. (allow_url_fopen obligatory with CURL)
Php должен найти другие способы сделать его более защищенным.
Это просто неправильно; вы можете сохранить файл без включения allow_url_fopen, даже если вы получили контент с помощью Curl.
Я бы не делал это. В то же время большинство атак на основе PHP предполагают, что на хосте работает Linux, поэтому некоторые из них в любом случае терпят неудачу.