?Где искать следы подключения по RDP?
Логи. В первую очередь следует немедленно проверить логи событий:
%SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx
Событие 1149 для успешного подключения до аутентификации с использованием логина и пароля, но после аутентификации IP-адреса источника подключения
Важно искать подключения с необычных IP-адресов, сюда же может попасть перебор паролей.
%SystemRoot%\System32\Winevt\Logs\Security.evtx
Событие 4624 — для успешного входа, 4625 — для неудачного входа, 4778 — для переподключения, 4634 — для отключения
Стоит обратить внимание на «LogonType». Для удаленных подключений оно будет равно 3, 10 или 7
Здесь необходимо искать успешные события входа с необычных IP-адресов, обращать внимание на неуспешные события входа — это может быть атака перебором.
%SystemRoot%\System32\Winevt\Logs\Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtx
События 21, 22 и 25 — для успешного входа или переподключения, 23 — для отключения
Следует искать события с необычных IP-адресов.
Нередко злоумышленники чистят логи. При этом чаще всего чистят только Security.evtx, чуть реже — Security.evtx и Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx сразу. По этой причине крайне желательно просматривать все три лога, а лучше заранее настроить перенаправление событий в SIEM-систему.
Сессии легитимных пользователей. Практически всегда злоумышленники, которые занимаются распространением шифровальщиков, начинают изучение внутренней сети своей жертвы почти сразу после проникновения. Иногда им удается переподключиться к уже имеющимся сессиям RDP-серверов, доступных из внутренней сети. Это может произойти, когда подключение легитимного пользователя уже установлено, но на уровне TCP оно разорвано (например, было закрыто окно RDP). В этом случае при повторном подключении сессия восстанавливается и злоумышленник входит на сервер. Это означает, что в логе можно увидеть, что подключение инициировано легитимным пользователем в день X, а в день X+N с той же машины уже переподключится атакующий. Поэтому следует смотреть не только на события установки подключений, но и на события переподключений и отключений.
Если следы обнаружены
- постараться изолировать злоумышленника (или вовсе отключить инфраструктуру от интернета, или отключить критичные серверы от локальной сети);
- проверить контроллер домена на следы взлома, а также проверить файловые помойки и другие возможные цели злоумышленника.
Отправка файлов
Кроме текстовой информации, существует возможность отправлять на сервер файлы любых типов.
Пример формы для загрузки файла:
Тут есть два важных отличия от первого примера:
- Добавился новый атрибут , который всегда должен иметь значение. Если его не будет, то файл не отправится.
- Сам файл загружается при помощи поля с типом «file».
В PHP загруженный файл будет доступен в другом специальном массиве — .
PHP автоматически сохраняет все загруженные файлы во временную папку на сервере. Но хранить там файлы нельзя, потому что эта директория периодически очищается, и ссылку на такой файл нельзя дать на сайте. Решение здесь только одно — переместить загруженный файл в другую папку. Перемещение файла всегда выполняют сразу после загрузки.
Для начала нужно убедиться, что в рабочей директории проекта существует папка для хранения загруженных файлов. Пусть она называется .
Перемещение загруженного файла
Для перемещения файла нужно знать, где он находится сейчас, и адрес папки, в которую он будет переноситься.
С текущим адресом всё крайне просто — он уже находится в массиве . Новый адрес файла, в свою очередь, состоит из пути к папке и имени файла. Так как папка находится там же, где и текущий сценарий, получить путь к ней можно так: .
Код для перемещения файла в новую папку:
Функция выполняет два действия:
- Проверяет, что файл действительно загружен через форму.
- Перемещает загруженный файл по новому адресу.
Временные метрики
Временные метрики не претерпели никаких принципиальных изменений.
Степень зрелости доступных средств эксплуатации
Доступен ли публично код или другие средства, с помощью которых можно провести атаку, или, напротив, существует только теоретическая возможность эксплуатации.
CVSSv2 | CVSSv3 |
---|---|
Название метрики | |
Exploitability (E) | Exploit Code Maturity (E) |
Возможные значения метрики | |
Not Defined (ND/X) | |
High (H) | |
Functional (F) | |
Proof-of-Concept (POC/P) | |
Unproven (U) |
В этой метрике изменилось только название: теперь оно точнее отражает назначение.
Доступные средства устранения уязвимости
Существуют ли официальные или неофициальные средства устранения уязвимости.
CVSSv2 | CVSSv3 |
---|---|
Название метрики | |
Remediation Level (RL) | |
Возможные значения метрики | |
Not Defined (ND/X) | |
Unavailable (U) | |
Workaround (W) | |
Temporary Fix (TF/T) | |
Official Fix (OF/O) |
В данную метрику изменения не вносились.
Степень доверия к информации об уязвимости
Степень детализации доступных отчетов об уязвимости
CVSSv2 | CVSSv3 |
---|---|
Название метрики | |
Report Confidence (RC) | |
Возможные значения метрики | |
Not Defined (ND) | Not Defined (X) |
Unconfirmed (UC) | |
Uncorroborated (UR) | |
Unknown (U) | |
Reasonable (R) | |
Confirmed | Confirmed |
В новом стандарте более четко описаны критерии для отнесения отчета об уязвимости к той или иной категории:
- Unknown — в существующих отчетах отсутствует описание причины уязвимости или различные исследователи расходятся относительно причин и возможных последствий эксплуатации;
- Reasonable — существуют отчеты об уязвимости, позволяющие судить о причинах уязвимости с достаточной степенью уверенности (например, в отчете приводится пример эксплуатирующего кода);
- Confirmed — уязвимость подтверждена производителем продукта или в свободном доступе находится полнофункциональный эксплойт.
Степень влияния временных метрик
Рассмотрим уязвимость:
CVE-2015–2373 — Уязвимость в сервисе Remote Desktop Protocol (RDP) операционной системы Windows позволяет удаленному атакующему выполнить произвольный код на системе путем отправки специально сформированных RDP-пакетов.
Как видно, в новом стандарте переработана формула расчета в пользу снижения общего влияния временных метрик на итоговую числовую оценку.
Примеры
Любителям ретрогейминга удалось найти уязвимости в классических видеоиграх, которые позволяют им выполнять произвольный код, обычно используя точную последовательность нажатия кнопок, чтобы вызвать переполнение буфера , позволяя им выполнять запись в защищенную память . На Awesome Games Done Quick 2014 группе энтузиастов скоростного прохождения удалось создать код и запустить версии игр Pong и Snake в копии Super Mario World , используя переполнение буфера для записи произвольного кода в память .
12 июня 2018 г. исследователь безопасности Жан-Ив Авенар из Mozilla обнаружил уязвимость ACE в Windows 10 .
1 мая 2018 г. исследователь безопасности обнаружил уязвимость ACE в архиваторе файлов 7-Zip .
PHP был предметом многочисленных уязвимостей ACE.
14 июля 2020 года компания Oversecured, занимающаяся безопасностью мобильных приложений, сообщила об ACE в основной библиотеке Play, которая приводит к выполнению произвольного кода в нескольких приложениях Android, включая Google Chrome .
Приветствие пользователя
По поставленному техническому заданию, нам нужно, чтобы в первом файле vhod.php показывалось авторизован ли пользователь на сайте. Для этого мы прописываем проверку, которая сверяет id и логин пользователя и если сессия для этого пользователя открыта, то появится запись, что, например, «Вы вошли на сайт, как test1». Форма входа при этом пропадёт и появится кнопка «Закрыть». Если сессия не открыта (то бишь значения id и логин в сессии пусты), появится запись «Вы вошли на сайт, как гость». При этом появится форма входа и ссылка на форму регистрации пользователей. Пример:
if(isset($_SESSION)) {$login='Здравствуйте, '.$_SESSION.'!';} // Проверяем, пусты ли переменные логина и id пользователя if (empty($_SESSION) or empty($_SESSION)) // Если пусты, то { echo "<p style='margin-left:60px;'>Вы вошли на сайт, как гость</p> <br> HTML-форма входа<br />Ссылка на форму регистрации"; } else // Если не пусты, то { echo "<br /><br />Вы вошли на сайт, как ".$_SESSION."<br><br />"; echo ('Кнопка ВЫЙТИ'); }
Функция exec
Функция exec служит для выполнения внешней программы. Синтаксис ее работы выглядит следующим образом:
Давайте рассмотрим перечень параметров:
• command — команда к исполнению, то есть exec() осуществляет выполнение команды command;
• output. Когда данный параметр указан, массив заполняется строками вывода программы. В данном случае завершающие пробелы в массив не включаются. Следует учесть, что если массив уже включает в себя какие-нибудь элементы, то функция добавляет в конец массива новые элементы. Но если вы этого не хотите, можно вызвать на этом массиве unset(), сделав это прежде его передачи в exec();
• return_var. Когда аргумент return_var находится вместе с output, статус возврата команды после выполнения записывается в этой переменной.
PHP Предупреждение о безопасности формы
Переменная может использоваться хакерами!
Если PHP_SELF используется на вашей странице, то пользователь может ввести косую черту и
некоторые Межсайтовые скрипты команды для выполнения.
Cross-site scripting (XSS), тип уязвимости компьютерной безопасности
обычно встречается в веб-приложениях. XSS позволяет злоумышленникам внедрить клиентскую часть
скрипт на веб страницы, просмотренные другими пользователями.
Предположим, у нас есть следующая форма на странице с именем «test_form.php»:
<form method=»post» action=»<?php echo $_SERVER;?>»>
Теперь, если пользователь введет нормальный URL-адрес в адресной строке, как
«http://www.example.com/test_form.php», приведенный выше код будет переведен на:
<form method=»post» action=»test_form.php»>
Пока все, хорошо.
Однако, считаю, что пользователь введет следующий URL в адресной строке:
http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert(‘hacked’)%3C/script%3E
В этом случае приведенный выше код будет переведен на:
<form method=»post» action=»test_form.php/»><script>alert(‘hacked’)</script>
Этот код добавляет тег скрипта и команду оповещения. И когда страница загружается,
будет выполнен код JavaScript (пользователь увидит окно предупреждения). Это просто
и безобидный пример того, как переменная PHP_SELF может быть использован.
Помните об этом любой код JavaScript может быть добавлен внутри тега
<script>! Хакер может перенаправить пользователя в файл на другом сервере,
и этот файл может содержать вредоносный код
это может изменить глобальные переменные или передать форму
адреса другому для сохранения пользовательских данных, например.
PHP Проверка данных формы
Первое, что мы сделаем, это передадим все переменные PHP функции .
Когда используется функция затем, если пользователь пытается отправить следующее текстовое поле:
— не будет выполняться, потому что она будет сохранена как сбежавший HTML код, как это:
Мы также сделаем еще две вещи, когда пользователь отправляет форму:
- Прокладка ненужных символов (лишний пробел, табуляции,
символы новой строки) ввод данных пользователя с отделкой функции - Удаление обратной косой черты
ввод данных пользователя с PHP функцией
Следующим шагом является создание функции, которая будет делать все проверки для нас
(гораздо удобнее, чем писать один и тот же код снова и снова).
Мы назовем функцию .
Теперь мы можем проверить каждую переменную с функцией , и скрипт будет выглядеть так:
Пример
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Обратите внимание, что в начале сценария мы проверяем, была ли форма
представленный используя. Если REQUEST_METHOD являться POST, затем
форма будет отправлена и она должна быть подтверждена
Если он не была отправленна, пропустите проверку и отобразите пустую форму.
Однако в приведенном выше примере все поля ввода являются необязательными.
Скрипт должен отлично работать, даже если пользователь не вводит никаких данных.
Следующий шаг состоит в том, чтобы сделать поля ввода обязательными и создать сообщения об ошибках, если
необходимо.
Справка и опции запуска PHP скриптов в командной строке
Справка содержит опции для разнообразных вариантов запуска файлов .php в командной строке, поэтому приведу её перевод полностью.
Использование:
php php -r php -R php -F php -S : php -- php -a
Как можно увидеть, вариантов запуска много. Если вы не совсем поняли, что имелось ввиду, не беспокойтесь. В начале мы ознакомимся со значением опций, изучим, так сказать, матчасть, а затем приступим к конкретным примерам, которые внесут окончательную ясность.
Опции:
-a Запустить интерактивный шелл (оболочку) -c <путь>|<файл> Искать файл php.ini в этой директории -n Не будут использоваться конфигурационные (ini) файлы -d foo Установить INI запись для значения 'bar' -e Сгенерировать расширенную информацию для отладчика/профайлера -f <файл> Разобрать и выполнить <файл>. -h Справка -i Информация о PHP -l Только проверка синтаксиса (lint) -m Показать скомпилированные модули -r <code> Запустить PHP <код> без использования тэгов скрипта <?..?> -B <начало_кода> Запустить PHP <начало_кода> перед обработкой строк ввода -R <код> Запустить PHP <код> для каждой строки ввода -F <файл> Разобрать и выполнить <файл> для каждой строки ввода -E <конец_кода> Запустить PHP <конец_кода> после обработки всех строк ввода -H Спрятать любые переданные аргументы от внешних инструментов. -S <адрес>:<порт> Запустить встроенный веб-сервер. -t <docroot> Указать корневую папку документов <docroot> для встроенного веб-сервера. -s Подсветка для HTML кода. -v Номер версии -w Вывести исходник с убранными комментариями и белыми пробелами. -z <файл> Загрузить расширение Zend <файл>. args... Передаваемые в скрипт аргументы. Используйте -- args когда первый аргумент начинается с — или скрипт считывается с stdin (стандартного ввода) --ini Показать имена конфигурационных файлов --rf <имя> Показать информацию о функции <имя>. --rc <имя> Показать информацию о классе <имя>. --re <имя> Показать информацию о расширении <имя>. --rz <имя> Показать информацию о расширении Zend <имя>. --ri <имя> Показать конфигурацию для расширения <имя>.
Замер времени выполнения части кода
Очень часто при профайлинге (а ещё чаще при поиске «тормозов» в коде) бывает необходимо замерить реальное время выполнения конкретного куска кода.
В PHP есть замечательная функция microtime(), которая возвращает текущее время в микросекундах. Если ей указать параметр true, то она будет возвращать его в виде числа с плавающей точкой, что нам и нужно.
Идея способа замера времени выполнения куска кода сводится к тому, чтобы запомнить текущее время перед началом этого куска и сравнить его с текущим временем в конце куска. То есть вот так:
$tt0 = microtime(true); // ... код, который мы проверяем .... $tt1 = microtime(true); echo '#1#='.($tt1-$tt0);
При этом после метки мы увидим время, потраченное на выполнение кода в секундах. Часто вы будете видеть что-то типа такого: 1.233433E-05, это инженерная форма записи очень малых и очень больших чисел. Можно привести её в нормальный вид, добавив функцию sprintf():
echo '#1#='.sprintf('%.6f', $tt1-$tt0);
Немного больше кода, но зато вы будете видеть нормальные числа вроде 0.000012, т.е. 12 микросекунд.
Вот и всё на сегодня, завтра я напишу специальную статью, в которой расскажу об ещё одном способе отладки с использованием выгрузки лога в файл (бывает полезно, если не хочется нарушать нормальную работу сайта, то есть вывод разных меток на страницу недопустим).
Спасибо за внимание, не забудьте подписаться, чтобы не пропустить очередную статью!
Как добавить / вставить PHP код в WordPress
Универсальный способ добавить код в functions.php WordPress — это использовать плагин My Custom Functions, Code Snippets или создать собственный. Они решают задачу интеграции PHP функций, и добавляют их так, будто они были написаны в файле темы functions.php. При этом ни обновление темы, ни даже её изменение на новую, данную интеграцию не нарушают.
My Custom Functions — плагин WordPress
Что в переводе означает — Мои пользовательские функции. Незаменимый инструмент для авторов и владельцев сайтов. Простой в использовании плагин WordPress с интуитивно понятным интерфейсом. My Custom Functions даёт вам возможность легко и безопасно добавлять свой собственный PHP-код на ваш сайт WordPress прямо из админ панели WordPress. Расширение переведён на русский язык. Скачали более 769 063 раз.
Плагин для ВордПресс — My Custom Functions
Больше не нужно редактировать файл functions.php вашей темы или какой-либо из ваших файлов плагинов для добавления собственного кода PHP. Просто добавьте свой собственный PHP-код в поле на странице плагина, и этот плагин сделает все остальное за вас. Он автоматически добавит ваш PHP-код на ваш сайт, без изменения каких-либо файлов вашей темы и без замедления вашего сайта.
Плагин работает полностью независимо от темы, поэтому вы можете использовать его с любой темой и независимо от того, имеет ли тема файл functions.php или нет. Код, который вы разместите на странице плагина, не изменится, если вы отредактируете содержимое файла functions.php темы или даже полностью измените тему.
Это действительно полезно в случае обновления темы или плагинов WordPress, потому что ваш собственный PHP-код никогда не будет перезаписан. Ваш собственный PHP-код будет продолжать работать независимо от того, сколько раз вы обновляете или переключаете тему и плагины.
Установка плагина My Custom Functions
Установите «Мои пользовательские функции» так же, как и любой другой плагин WordPress. Автоматически через админку WordPress. Плагины — Добавить новый. Найдите плагин через поиск. Установите и активируйте его:
Установка и активация плагина My Custom Functions
После установки и активации в разделе Настройки появится пункт PHP Inserter. Кликните по нему, откроется страница настроек плагина My Custom Functions:
Страница настроек My Custom Functions
На странице плагина вы найдете редактор кода на базе CodeMirror. Этот редактор кода имеет такие параметры, как выделение синтаксиса, нумерация строк и многое другое.
Проксирование
Этот метод отличается от всех вышеперечисленных, и служит совсем для других задач, но не менее актуален. Когда делегирование полномочий невозможно, или предоставляет слишком большие возможности, он позволяет разрешить обычному пользователю выполнять некую команду. Требующую административных привилегий, никаким образом не выдавая дополнительных полномочий и не подставляя под угрозу пароль администратора.
Чаще всего такие проблемы люди решают с помощью утилит вроде cpau.exe. Они создают файл с зашифрованным паролем административной учетной записи, позволяющий запускать определённую программу. Проблема, однако, в том, что хоть пароль и зашифрован, перед запуском программы утилите придётся его расшифровать. А соответственно пользователь может использовать утилиту повторяющую алгоритм расшифровки пароля, и узнать его, чтобы затем использовать для запуска других программ или получения дополнительных привилегий. Практически это конечно достаточно сложно для обычных пользователей, не обладающих специальными знаниями, но, тем не менее, вполне возможно. Еще раз уточню, это не беда конкретной утилиты, а проблема такого подхода вообще.
Еще может показаться, что для решения задачи подойдет параметр /savecred утилиты runas. Но тут есть даже две проблемы. Во-первых, как и вышеописанном случае, пароль сохраняется на компьютере пользователя, а, следовательно, может быть расшифрован, хотя в случае с runas для этого и понадобятся права локального администратора. Во-вторых, runas сохраняет учетные данные, не связывая их с конкретной командой, а, следовательно, пользователь сможет запустить с завышенными правами не только ту команду, доступ к которой вы хотели ему предоставить, но и любую другую.
Чтобы избежать этих проблем, но, тем не менее, разрешить выполнение конкретной команды, можно использовать методику, которая называется «проксированием».
Работает она следующим образом. На компьютере постоянно работает сценарий с высокими привилегиями. Например, в нашем случае он будет запущен из-под учетной записи, обладающей правами администратора на файловом сервере. По сигналу пользователя он будет выполнять одну, заранее определённую команду. В этом примере – закрывать все файлы, открытые по сети.
Для организации этой системы мы поместим на сервере, например в папке c:\scripts\ командные файлы Server.cmd и Action.cmd .
Листинг №5 – Action.cmd (Windows Batch)
Server.cmd будет ждать знака от пользователя, и получив его, запускать файл с командами – Action.cmd. Разумеется, в эту папку пользователи не должны иметь никакого доступа. Автоматический запуск Server.cmd при запуске компьютера можно организовать, просто создав соответствующую задачу в планировщике:
После параметра /ru указывается учетная запись, под которой будет выполняться сценарий (в нашем случае она обладает правами администратора на сервере), так как после параметра /rp пароль не указан – он будет запрошен при создании задачи. Параметр /sc позволяет указать момент запуска сценария, в нашем случае – при включении компьютера. Ну а /tn и /tr позволяют указать имя задачи, и исполняемый файл.
Теперь, для того чтобы пользователь мог подать сценарию сигнал, мы создадим папку c:\commandShare и сделаем её доступной по сети. Доступ на запись в эту папку должен быть только у тех пользователей, которые будут запускать команду.
После этого достаточно будет поместить пользователю на рабочий стол файл Run.cmd.
Листинг №6 – Run.cmd (Windows Batch)
При его выполнении, от имени пользователя, будет создаваться файл \\server\commandShare\trigger.txt. Сценарий Server.cmd, заметив его, запустит на выполнение со своими привилегиями файл Action.cmd. Он добавит запись в файл c:\scripts\log.txt о текущем времени, а затем удалит trigger.txt .Чтобы не выполнять команду снова до следующего сигнала пользователя.
В сценарии Server.cmd используется утилита Sleep.exe, позволяющая сделать паузу в выполнении сценария на заданный в секундах промежуток времени. Она не входит в состав операционной системы, но её можно взять из набора Resource Kit Tools (см. ссылки) и просто скопировать на любой компьютер.
Выполнить команду на удалённом компьютере через PsExec.exe
Один из моих любимых способов для решения этой задачи это утилита командной строки PsExec.exe написанная Марком Руссиновичем, которую вы можете свободно скачать с сайта Windows SysInternals. Ссылку на неё вы можете найти в конце статьи. Она не требует установки в систему, вы можете просто скопировать её в одну из папок, содержащихся в переменной окружения %path% и вызывать из любой оболочки командной строки: Cmd или PowerShell.
Использовать PsExec очень просто. Например, чтобы выполнить ipconfig /flushdns на компьютере main, достаточно запустить следующую команду:
Команда ipconfig будет запущена на компьютере main под вашими учетными данными. После завершения работы ipconfig весь текстовый вывод будет передан на ваш компьютер, а кроме того будет возвращён код выхода команды (error code). В случае если команда выполнилась успешно, он будет равен 0.
Выполнить команду на удалённом компьютере
Разумеется, на этом возможности PsExec не заканчиваются. Вызвав утилиту без параметров, можно посмотреть другие доступные опции
Я обращу внимание лишь на некоторые из них
Ключ -d говорит PsExec что ненужно дожидаться выполнения команды, а достаточно лишь запустить её, и забыть. В этом случае мы не получим выходных данных от консольной утилиты, но зато сможем не дожидаясь завершения предыдущей команды запускать другие. Это очень полезно, если вам необходимо запустить, например установщик программы на нескольких компьютерах.
По умолчанию PsExec выполняет команды в скрытом режиме, то есть на системе где выполняется команда, не будут выводиться никакие окна или диалоги. Однако есть возможность изменить это поведение, с помощью ключа -i . После него можно указать номер сессии, в которой выводить окна, а можно и не указывать, тогда интерфейс будет отображен в консольной сессии.
Таким образом, чтобы вывести окно с информацией о версии операционной системы на компьютере main, следует запустить PsExec таким образом:
Если вы хотите выполнить команду сразу на нескольких компьютерах, вам пригодится возможность прочитать их имена из текстового файла списка.
Ну и одной из самых полезных способностей PsExec является возможность интерактивного перенаправления ввода/вывода между компьютерами, что позволяет нам запустить, например cmd.exe на удалённом сервере, а давать ему команды и получать результаты на локальном компьютере.
Выполнить команду на удалённом компьютере
Каким образом работает PsExec?
Следующий способ реализации этой популярной задачи, о котором я хочу поведать – использование Windows Management Instrumentation. WMI присутствует во всех операционных системах Microsoft, начиная с Windows 2000, и даже на Windows 9x его можно установить из отдельного пакета. WMI включён по умолчанию, и не требует дополнительной настройки. Для его использования достаточно административных прав, и разрешенного на брандмауэре протокола DCOM. WMI предоставляет огромные возможности для управления системами, но нас сейчас интересует лишь одна из них.
Для запуска процессов нам потребуется метод Create класса Win32_Process. Использовать его достаточно несложно. В PowerShell это делается следующим образом:
Здесь в качестве запускаемого процесса я указал cmd.exe, а уже ему, в качестве аргументов передал нужную команду. Это необходимо в случае если вам нужно использовать переменные окружения удалённого компьютера или встроенные операторы cmd.exe, такие как «>» для перенаправления вывода в файл. Метод Create не дожидается завершения процесса, и не возвращает результатов, но зато сообщает нам его идентификатор – ProcessID.
Если вы используете компьютер, на котором пока не установлен PowerShell, вы можете вызвать этот метод WMI и из сценария на VBScript. Например вот так:
Выполнение PHP кода в статьях WordPress без плагина
По аналогии с виджетами, мы можем заменить плагин на специальную функцию, разрешающую выполнение PHP скриптов в контенте. К сожалению, мне не удалось найти вариант, при котором код работал бы автоматически как в случае с плагином, реагируя на теги. Требуется использование шорткода. Моих познаний в PHP не хватило для самостоятельного написания нужной функции, за сим привожу как есть. Работа с шорткодом имеет существенный недостаток, осложняющий работу, о нем я расскажу ниже.
Как работать с описанной ниже функцией
- Вставляем ее в файл functions.php темы;
- В нужном месте статьи вставляем конструкцию – исполняемый код без <?php и ?>
Функция:
/* Запуск php в статьях и страницах WordPress: код */ function start_php($matches){ eval('ob_start();'.$matches.'$inline_execute_output = ob_get_contents();ob_end_clean();'); return $inline_execute_output; } function inline_php($content){ $content = preg_replace_callback('/\((.|\n)*?)\[\/startphp\]/', 'start_php', $content); $content = preg_replace('/\((.|\n)*?)\[\/startphp\]/', '$1', $content); return $content; } add_filter('the_content', 'inline_php');
Недостаток
Если внутри вставляемого PHP кода есть HTML вставки или текст, то он работать не будет. Любой текст или теги придется вставлять с помощью команды echo, что не всегда удобно. То есть, код должен быть чисто PHP-шный на 100 правильного формата.
Правильно
echo '<a href="https://biznessystem.ru">Так работать будет</a>';
Неправильно
echo '<a href="https://biznessystem.ru">Эта строка правильная</a>'; <a href="https://biznessystem.ru">Так работать не будет</a>
В плагине Exec-PHP такой заморочки нет – и текст и HTML исполнятся, но все элементы PHP кода должны быть обрамлены в соответствующие теги.
Для многих вебмастеров тема, описанная в этой статье открывает бесконечные возможности для творчества – можно реализовать то, чего раньше сделать не получалось, а также избавиться от массы плагинов, заменив их на разные фильтры, функции и хуки.
Браузерная панель управления ws сервером
Разработаю простую систему управления и мониторинга демона. Она очень проста и состоит из нескольких файлов echowsadmin.html (панель администратора), echowsadmin.js (логика панели администратора), echowsadmin.php (логика управления ws echo сервером). Разработать эту систему оказалось на удивление просто, я потратил не более 1го часа своего времени.
Для того, чтобы любой пользователь не мог выключить демона командой OFF, я убрал этот функционал из PHP кода ws echo сервера. Соответственно, реализовав функцию выключения из системы управления демоном. Реализация не самая изящная, вместо сигналов я использую файл off_file.pid, но зато гарантированно не требуется никаких дополнительных библиотек и выключение происходит корректно. Т.к. на ws сервере цикл while повисает в моментах слушания сообщений сокета, то после создания off_file.pid нужно соединиться с ws сервером чтобы он дошел до конца цикла и проверил наличие off_file.pid, для этого делаю небольшую хитрость, имитирую подключение по сокету из echowsadmin.php и ввожу некоторую задержку чтобы всё сработало и скрипт сообщил о благополучном завершении работы. Скачайте архив разработанной системы управления, ws сервера и клиента (устаревший архив, более новый в Downloads), не забудьте указать адрес расположения файла echowsadmin.php на вашем хостинге в echowsadmin.js в строке 10, адрес echowsstart.php в socket.js и адрес ws сервера в echowsadmin.php (вернее не адрес, а порт, т.к. файл должен находиться на сервере то адрес всегда будет 127.0.0.1), куда будет пытаться подключиться наш одноклеточный мини клиент при выключенном ws echo сервере. Кнопку перезапуска ws echo сервера я делать не стал, так как понятно, что для этого нужно нажать stop, а затем start и необходимость этого действия в одной кнопке практически отсутствует. Вся эта система управления работает только под управлением *nix операционных систем, т.е. на хостинге. А вот так она выглядит.
Панель управления демоном
Очевидно, что можно много чего улучшить:
- Улучшить представление и сделать более детальной информацию о статусе ws сервера
- Добавить вывод в лог более подробной информации о занимаемой памяти и количества текущих соединений
- Сделать проверку на операционную систему и разработать версию для Денвера и Windows
- Сделать авторизацию
Но, в моём случае стояла задача сделать себе простенький инструмент мониторинга состояния демона через веб. Кстати, эту штуку слегка модифицировав можно использовать для мониторинга любого демона, а не только ws.
А что касается реализации для ОС Windows, то все места где pid можно обходить проверкой и таким образом обеспечиь запускаемость.
if (strtoupper(substr(PHP_OS,0,3)) === 'WIN') { }
А запущен демон или нет достаточно проверять просто наличием pid файла.
Пока я был на выходных, забыл выключить ws echo сервер, в итоге время его жизни составило 233774 секунд, т.е. где-то около 3х суток, занимаемая память так и осталась около 0.1%, что говорит о том, что решение имеет право на жизнь.
Отзывы, комментарии всегда приветствуются. Продолжу развивать тему и в следующей статье реализую простенький чат как и обещал.