PHP Fastcgi / CGI — директива cgi.force_redirect
PHP работает с FastCGI. Fascgi уменьшает объем памяти, занимаемый вашим веб-сервером, но по-прежнему дает вам скорость и мощность всего языка PHP. Вы можете настроить Apache2 + PHP + FastCGI или cgi, как описано здесь . Директива конфигурации cgi.force_redirect запрещает кому-либо вызывать PHP напрямую с URL-адресом, например http://itfb.com.ua/cgi-bin/php/hackerdir/backdoor.php. Включите cgi.force_redirect из соображений безопасности. Отредактируйте /etc/php.d/security.ini и установите следующую директиву:
; Включите cgi.force_redirect из соображений безопасности в типичной настройке * Apache + PHP-CGI / FastCGI * cgi.force_redirect = On
Знай своего врага
Приложения на основе PHP могут сталкиваться с различными типами атак. Я заметил разные типы атак:
- XSS — межсайтовый скриптинг — это уязвимость в веб-приложениях на PHP, которую злоумышленники могут использовать для кражи информации пользователей. Вы можете настроить Apache и написать более безопасные сценарии PHP (проверяющие все вводимые пользователем данные), чтобы избежать атак xss.
- SQL-инъекция — это уязвимость на уровне базы данных приложения php. Если пользовательский ввод неправильно отфильтрован, приложение может выполнять любые операторы SQL. Вы можете настроить Apache и написать безопасный код (проверяющий и фильтрующий все вводимые пользователем данных), чтобы избежать атак SQL-инъекций. Обычной практикой в PHP является экранирование параметров с помощью функции mysql_real_escape_string () перед отправкой запроса SQL.
- Загрузка файлов — позволяет посетителю размещать файлы (загружать файлы) на ваш сервер. Это может привести к различным проблемам с безопасностью, таким как удаление ваших файлов, удаление базы данных, получение сведений о пользователе и многое другое. Вы можете отключить загрузку файлов с помощью php или написать безопасный код (например, проверить ввод данных пользователем и разрешить только файлы изображений, такие как png или gif).
- Выполнение локальных и удаленных файлов. Злоумышленник может открывать файлы с удаленного сервера и выполнять любой PHP-код. Это позволяет им загружать файл, удалять файл и устанавливать бэкдоры. Вы можете настроить php для отключения удаленного выполнения файла.
- eval () — оценивает строку как код PHP. Часто используется злоумышленниками, чтобы скрыть свой код и инструменты на самом сервере. Вы можете настроить php, чтобы отключить eval ().
- Cross-site request forgery – (подделка межсайтовых запросов — CSRF) — эта атака вынуждает конечного пользователя выполнять нежелательные действия в веб-приложении, в котором он / она в настоящее время аутентифицирован. Успешный эксплойт CSRF может поставить под угрозу данные и работу конечного пользователя в случае обычного пользователя. Если целевой конечный пользователь является учетной записью администратора, это может поставить под угрозу все веб-приложение.
Настройка файла php.ini
Для удобства ориентирования мы разобьем все параметры по категориях в зависимости от их назначения. Вам будет достаточно найти нужный параметр и изменить его значение. А теперь откройте файл настроек php, например, для модуля apache и перейдем к настройке. Чтобы избежать ошибок не добавляйте новые строки, а ищите уже существующие и изменяйте значения на нужные:
Сначала идет немного информации о самом файле в виде комментариев, затем интересующие нас настройки.
Вывод ошибок в php
Настройка php 7 обычно начинается с конфигурации вывода ошибок. Все настройки вывода ошибок находятся в разделе Error handling and logging. По умолчанию вывод ошибок на экран во время выполнения скрипта отключен. Это сделано для того, чтобы пользователи не смогли увидеть ничего лишнего. Вместо этого, все ошибки записываются в лог файл. Если вы используете php на домашнем компьютере, то такие меры не нужны и вы можете сразу выводить все на экран:
Замените off на on. В php используются различные типы ошибок, например, критические, предупреждения, ошибки синтаксиса, с помощью строки error_reporting вы можете включить вывод только определенных типов ошибок:
Если нужно объединить несколько типов ошибок, то используйте символ &, а для отключения отображения поставьте перед типом знак ~. Приведенный выше пример отображает все ошибки (E_ALL), кроме сообщений об устаревших функциях (E_DEPRECATED). Вы можете отключить все типы использовав 0:
Включите запись ошибок php в лог файл, если не выводите их на экран:
Чтобы не засорять лог однотипными сообщениями можно игнорировать повторяющиеся ошибки в пределах одного исполнения:
Ограничения ресурсов
Если бы скрипты php никак не ограничивались в ресурсах, то они запросто могли бы перегрузить сервер и не дать ему нормально работать. Поэтому, по умолчанию php устанавливает жесткие ограничения, но, возможно, вам нужно будет их немного ослабить.
По умолчанию максимальное время выполнения скрипта — 30 секунд, сделаем минуту:
Если указать 0, то скрипт может выполняться бесконечно. Вы также можете ограничить время, на протяжении которого скрипт будет загружать данные, 60 секунд:
Максимальное количество переменных в GET и POST:
Следующий параметр задает максимальное количество памяти, которую может использовать один скрипт во время своего выполнения, в мегабайтах:
Максимальный размер данных, передаваемых в POST запросе тоже ограничивается, размер по умолчанию — 8 Мегабайт:
Вы можете ограничить область действия php в системе с помощью опции openbase_dir, она указывает папку, выше которой скрипт не может получить доступ к файловой системе:
С помощью директив disable_functions и disable_classes вы можете отключить использование в скриптах определенных функций или классов, например, это может быть полезно для веб-хостингов. В этом примере мы отключаем использование функции ini_set, которая позволяет менять настройки php из скрипта:
Директории по умолчанию
Файл настройки php.ini позволяет указать пути в файловой системе по умолчанию для различных действий. Вы можете задать папки где система будет искать скрипты, если вы попытаетесь подключить их с помощью инструкции include:
Папка с модулями php:
Папка для записи временных файлов:
Загрузка файлов
Для того чтобы пользователи могли загружать свои файлы на сервер, например, фото, нужно включить эту функцию в php:
Максимальный размер загружаемого файла:
Максимальное количество файлов, которые может загрузить один скрипт:
Настройка php.ini практически завершена, нам остались лишь расширения.
Настройка расширений
Расширения позволяют очень сильно увеличить функциональность php. Например, благодаря расширениям вы можете использовать в своих скриптах базы данных mysql, postgresql, mysqli, sqlite, графическую библиотеку gd и многое другое. Все это включается в этом разделе.
Для включения расширения достаточно убрать комментарий перед строкой с его командой, например:
Обратите внимание, что для windows расширение будет иметь формат dll, но для linux нужно использовать so. В следующих секциях идет настройка каждого из расширений, но мы их рассматривать не будем потому что они обычно не требуют настройки
Восстановление значения переменной
Чтобы восстановить значение переменной под администратором:
- Нажмите Настройки web-сервера → PHP → Восстановить.
- Изменённое значение удаляется из глобального конфигурационного файла PHP.
- Для каждого пользователя ISPmanager:
- Содержимое пользовательского конфигурационного файла полностью заменяется на содержимое глобального файла.
- Значения из конфигурационного файла изменённых параметров пользователя заменяют соответствующие значения в пользовательском конфигурационном файле.
Чтобы восстановить значение переменной под пользователем:
- Нажмите WWW → PHP → Восстановить.
- Изменённое значение удаляется из пользовательского конфигурационного файла PHP.
Final Notes on Editors, File Permissions, Server Restarts
Because is a configuration file, and because it’s often on a server, you may hit a couple issues: you’ll not have easy access to the file via your usual comfortable tools, when you’ve edited the file you may not be able to save your changes, or the changes you made may seem to have no effect.
Opened without lead to warning of no write permission and the inability to save your changes…
For editing, when you’re new to the terminal and SSHing into a box for the first time: is the best text editor. All of its keyboard shortcuts are clearly spelled out on the screen. (^ is the CTRL key…) It’s still really the only command-line text editor I use, because I rarely need one and it’s got just enough features to keep me satisfied. So I often edit my on a remote server with a command like:
This isn’t a thorough-going lesson on the command line — though I should probably write one of those sometime… — but I’m using to open the file at the path .
What’s that thing? Well on a well-configured server (at least from a security perspective) a common users shouldn’t be able to change complicated configuration files. is the way you temporarily request “administrator” or “super user” access-levels while a normal user. ( is short for “super user do.”) You’ll get prompted for the password when you do that, but then you’ll be able to save your from . Without that, you’ll probably be unable to change the file. And that doesn’t work!
Finally, you *may* need to restart your server or the FastCGI daemon. Whether or not that’s absolutely required depends on some of the subtleties of how exactly our server is configured. If you’re making changes and it’s not having an effect — you’ll know with your page — and you’re on a server where you have the power to restart (not shared hosting), you may need to. The specific command for that vary a fair amount on server configuration and operating system, however, so I’ll leave you to Google for them.
Как удалить Composer
Composer — это файл. В большинстве случаев для удаления его достаточно просто удалить.
Если вы не помните куда был установлен Composer, то просто поищете, например, с помощью встроенной системы поиска операционной системы этот файл.
Но так удалять не всегда корректно, все зависит от того, как вы его устанавливали. Если у инструмента, с помощью которого вы его устанавливали, есть возможность и его удаление, то выполняйте это действие с помощью этого инструмента.
Например, если вы Composer устанавливали с помощью инструмента apt-get, то и используйте его для удаления этой программы.
Например, если вы устанавливали Сopmoser в Windows с помощью программы Composer-Setup.exe, то удаления программы выполняйте стандартным образом через «Приложения и возможности» (только в Windows 10) или через «Удаление или изменение программы».
Выбор типа пула — dynamic / static / ondemand
Также, стоит обратить внимание на настройки менеджер процессов (pm). По сути это главный процесс (master process), который будет управлять всеми дочерними (которые выполняют код приложения) по определенной логике, которая собственно и описана в файле конфигурации
Всего доступно 3 схемы управления процессами:
- dynamic
- static
- ondemand
Наиболее простой — это static. Схема его работы заключается в следующем: запустить фиксированное количество дочерних процессов, и поддерживать их в рабочем состоянии. Данная схема работы не очень эффективна, так как количество запросов и их нагрузка может меняться время от времени, а количество дочерних процессов нет — они всегда занимают определенный объем ОЗУ и не могут обрабатывают пиковые нагрузки в порядке очереди.
dynamic пул позволят решить эту проблему, он регулирует количество дочерних процессов исходя из значений конфигурационного файла, изменяя их в большую или меньшую сторону, в зависимости от нагрузки. Данный пул больше всего подходит для сервера приложений, в котором необходима быстрая реакция на запрос, работа с пиковой нагрузкой, требуется экономия ресурсов (за счет уменьшения дочерних процессов при простое).
ondemand пул очень похож на static, но он не запускает дочерних процессов при старте главного процесса. Только когда придет первый запрос — будет создан первый дочерний процесс, и по истечении определенного времени ожидания (указанного в конфигурации) он будет уничтожен. Потому он актуален для серверов с ограниченными ресурсами, или той логики которая не требует быстрой реакции.
Значения параметров конфигурации PHP, полезные для WordPress разработчиков
Лично мне регулярно приходится сталкиваться со значениями php info файла для max_execution_time, memory_limit, upload_max_filesize и post_max_size. Существуют сотни значений, которые устанавливаются в файле php.ini и файлах различных расширений, с которыми работает PHP. Но только с этими четырьмя параметрами мне регулярно приходится иметь дело. Краткое описание каждого из них:
- max_execution_time — определяет, как долго PHP-скрипт будет исполняться до того, как он будет принудительно остановлен. По умолчанию, это примерно 30 секунд, поэтому один плохой скрипт не может заблокировать весь сервер. Я увеличиваю это значение, чтобы скрипты могли выполняться немного дольше тридцати секунд. Просто имейте в виду, что при этом увеличивается риск случайного или злонамеренно запуска продолжительного скрипта;
- memory_limit – с помощью этого параметра php info file можно разрешить процессу потреблять больше памяти сервера. Это опасно, если один из запросов пользователей начинает использовать больше ресурсов, чем следует. Но это бывает полезно при использовании специализированных плагинов для кэширования страниц;
- upload_max_filesize и post_max_size настолько похожи, что я объединил их в один пункт. Если необходимо обеспечить возможность принимать файлы размером в сотни мегабайт, вам придется повозиться с этими значениями. Увеличение этих значений может повысить потребление ресурсов сервера. post_max_size влияет на общий допустимый размер HTTP-запроса POST, а upload_max_filesize – на максимальный размер любого отдельного файла, который должен принять PHP. Мне часто приходится менять значение этих параметров, чтобы разрешить отправку большого файла в одном POST-запросе. Я всегда задаю для них одинаковые значения.
Программирование с аннотациями
Помимо простой работы с PHPDocumentor некоторые системы пошли дальше и придумали для своих целей собственные виды аннотаций. И некий программный код через рефлексию парсит эти данные. Взять хоть первый попавшийся пример с сайта StackOverflow:
$r = new ReflectionClass($class); $doc = $r->getDocComment(); preg_match_all('#@(.*?)\n#s', $doc, $annotations); print_r($annotations1);
Аналогично можно получить и парсить уже их.
В итоге этот подход нашёл новое применение. Например, в Symfony Framework с помощью собственных аннотаций (помимо конфигурации в YAML или XML-файлах) с использованием пакета можно конфигурировать те же сущности прямо в коде:
namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; class Product { protected $id; protected $name; protected $price; protected $description; }
или ту же маршрутизацию контроллеров:
class BlogController extends Controller { public function showAction($slug) { } }
И фреймворк легко парсит эти данные и кеширует в простые PHP-массивы, чтобы не парсить их каждый раз снова и снова.
Также в уроке по тестированию мы рассматривали аннотации вроде и для тестов в пакете PHPUnit.
Этот подход уже мало связан с оригинальным PHPDoc, так как просто использует его идею. Но при этом друг другу никто не мешает и можно спокойно использовать различные ключи вместе:
class Product { @var protected $name; }
Многим такой подход с конфигурированием аннотациями в Symfony не нравится, так как он нарушает принцип единой ответственности, смешивая программный код и конфигурацию в одном файле. Так что используйте по своему усмотрению.
Переменные из ниоткуда
Или ещё вариант. Есть некое представление, в которое из контроллера передаётся переменная . К тому же, это представление рендерится в объекте класса , который и будет доступен через :
<?php use yii\helpers\Html; use yii\widgets\DetailView; $this->title = $model->meta_title; $this->registerMetaTag('name' => 'description', 'content' => $model->meta_description); $this->registerMetaTag('name' => 'keywords', 'content' => $model->meta_keywords); $this->params'breadcrumbs' = 'label' => 'Блог', 'url' => 'index'; $this->params'breadcrumbs' = $this->title; <div class="user-view"> <h1> Html::encode($this->title) </h1> ... </div>
Но IDE не в курсе наших планов, поэтому сразу подсвечивает переменные и как не определённые в этом файле. Для исправления ситуации мы можем добавить сколько угодно Doc-блоков с аннотацией прямо внутрь кода представления:
<?php use yii\helpers\Html; use yii\widgets\DetailView; @var @var $this->title = $model->meta_title; ...
При этом для можно указать сначала тип, потом имя переменной:
@var
В итоге автоподстановка, поиск и автозамена полей и методов объектов заработают для этих переменных автоматически.
Openserver Maximum execution time of 300. Help! 🙂
MoMM, в openserver конфиг правится по этому адресу:
Есть еще один конфиг, который перезаписывается при каждом запуске. В него бесполезно вносить настройки. Он находится тут:
Вы в какой конфиг вносили правки?
именно он и поправлен, только я 5.5 пользуюсь. мкасимальный размер файла нормально изменился на 2048, а вот время исполнения никак не хочет меняться и постоянно ошибка рочно через 300 сек, хотя прописывал уже и 30000 и 3600.
там 0 (без ограничений) работает в этом месте?
дык каждый раз перезагружаю
Можете ещё попробовать в начало скрипта вставить:
или сколько хотите.
LEOnidUKG: Можете ещё попробовать в начало скрипта вставить:
в начало PHP-5.4_php.ini ?
Это в начало php файла.
MoMM, Советую такие большие файлы заливать через консоль openserver. Это проще простого.
Для этого открываем консоль:
Переходим в директорию mysql (проверьте свой путь и версию mysql)
Копируем базу в корень диска С. Далее вводим:
Эта команда подходит когда заранее создана база «test» и у пользователя root нет пароля.
Используйте расширения безопасности Linux (например, SELinux).
Linux поставляется с различными патчами безопасности, которые можно использовать для защиты от неправильно настроенных или скомпрометированных серверных программ. По возможности используйте SELinux и другие расширения безопасности Linux, чтобы наложить ограничения на сеть и другие программы. Например, SELinux предоставляет множество политик безопасности для ядра Linux и веб-сервера Apache. Чтобы просмотреть все переменные защиты Apache SELinux, введите:
# getsebool -a | grep httpd
Примеры вывода результатов:
allow_httpd_anon_write -> Off allow_httpd_mod_auth_ntlm_winbind -> Off allow_httpd_mod_auth_pam -> Off allow_httpd_sys_script_anon_write -> Off httpd_builtin_scripting -> на httpd_can_check_spam -> Off httpd_can_network_connect -> Off httpd_can_network_connect_cobbler -> Off httpd_can_network_connect_db -> Off httpd_can_network_memcache -> Off httpd_can_network_relay -> Off httpd_can_sendmail -> Off httpd_dbus_avahi -> на httpd_enable_cgi -> на httpd_enable_ftp_server -> Off httpd_enable_homedirs -> Off httpd_execmem -> Off httpd_read_user_content -> Off httpd_setrlimit -> Off httpd_ssi_exec -> Off httpd_tmp_exec -> Off httpd_tty_comm -> на httpd_unified -> на httpd_use_cifs -> Off httpd_use_gpg -> Off httpd_use_nfs -> Off
Чтобы отключить поддержку Apache cgi, введите:
# setsebool -P httpd_enable_cgi off
Шаг 4 — Тестирование сайтов
Мы настроили два сайта для работы с двумя разными версиями PHP. Теперь проверим результаты.
Откройте в браузере сайты и . Вы увидите две страницы, выглядящие следующим образом:
Обратите внимание на заголовки. На первой странице указано, что на сайте развернута версия PHP 7.0
На второй странице указано, что на сайте развернута версия PHP 7.2.
Мы протестировали сайты и теперь можем удалить файлы . Эти файлы представляют собой угрозу безопасности, поскольку они содержат важную информацию о вашем сервере и при этом доступны неуполномоченным пользователям. Чтобы удалить оба файла, запустите следующие команды:
Теперь у вас имеется один сервер Ubuntu 18.04, обслуживающий два сайта с двумя разными версиями PHP. Однако PHP-FPM можно применять и для других целей.
Подключение примесей
Вначале мы рассмотрели виртуальные переменные. Теперь предположим, что к своему классу мы примешиваем любое поведение вроде:
composer require yii-dream-team/yii2-upload-behavior
Его достаточно добавить в метод :
@property @property @property @property @property @property class Post extends ActiveRecord { ... public function behaviors() { return 'class' => ImageUploadBehavior::className(), 'createThumbsOnRequest' => true, 'attribute' => 'image', 'filePath' => '@webroot/uploads/posts/`pk`.`extension`', 'fileUrl' => '@web/uploads/posts/`pk`.`extension`', 'thumbPath' => '@webroot/uploads/posts/`profile`_`pk`.`extension`', 'thumbUrl' => '@web/uploads/posts/`profile`_`pk`.`extension`', 'thumbs' => 'thumb' => 'width' => 100, 'height' => 100, 'preview' => 'width' => 250, 'height' => 180, , , ; } }
и в представлениях выводить оригинал или превью:
<?= Html::img($post->getImageFileUrl('image')) Html::img($post->getThumbFileUrl('image', 'preview'))
А мы помним, что IDE ругается на всё, чего нет в классе. Но с помощью аннотации , которую поддерживает IDE PhpStorm и, возможно, некоторые другие, можно «подмешать» класс поведения:
@property @property @property @property @property @property @mixin class Post extends ActiveRecord { ... }
и все методы и прочие будут доступны в автоподстановке.
Но есть один нюанс. Помимо нужных методов в классе поведения имеется и много ненужных. Например, вспомогательные или , которые мы использовать не будем.
В таком случае вместо примешавания всего класса поведения с помощью мы можем просто добавить определение только пары нужных нам виртуальных методов:
@property @property @property @property @property @property @method @method class Post extends ActiveRecord { ... }
Аналогично можно добавлять сигнатуры любых своих методов, работающих через свой магический метод .
Более подробно о функции error_reporting ()
Функция сообщения об ошибках — это встроенная функция PHP, которая позволяет разработчикам контролировать, какие ошибки будут отображаться. Помните, что в PHP ini есть директива error_reporting, которая будет задана этой функцией во время выполнения.
Для удаления всех ошибок, предупреждений, сообщений и уведомлений передайте в функцию error_reporting ноль. Можно сразу отключить сообщения отчетов в ini-файле PHP или в .htaccess:
PHP позволяет использовать переменные, даже если они не объявлены. Это не стандартная практика, поскольку необъявленные переменные будут вызывать проблемы для приложения, если они используются в циклах и условиях.
Иногда это также происходит потому, что объявленная переменная имеет другое написание, чем переменная, используемая для условий или циклов. Когда ENOTICE передается в функцию errorreporting, эти необъявленные переменные будут отображаться.
Функция сообщения об ошибках позволяет вам фильтровать, какие ошибки могут отображаться. Символ «~» означает «нет», поэтому параметр ~ E_NOTICE означает не показывать уведомления
Обратите внимание на символы «&» и «|» между возможными параметрами. Символ «&» означает «верно для всех», в то время как символ «|» представляет любой из них, если он истинен
Эти два символа имеют одинаковое значение в условиях PHP OR и AND.
Эти три строки кода делают одно и то же, они будут отображать все ошибки PHP. Errorreporting(EALL) наиболее широко используется разработчиками для отображения ошибок, потому что он более читабелен и понятен.