Многие сайты подвергаются взлому, и очень часто владельцы сайтов узнают об этом не сразу. Безусловно, для избежания подобного необходимо обеспечить безопасность сайта должным образом, убирать все дыры, проверять входящие данные и т.д. Но далеко не всегда разработчику удаётся это сделать, т.к. в проектах очень часто используются пакеты, плагины, расширения и пр. подобные вещи сторонних разработчиков. Уязвимости могут быть в любом месте.
Библиотека создает слепок файловой системы проекта и считает контрольную сумму. Это необходимо для контроля несанкционированных изменений файлов веб-проекта. Суть работы скрипта очень проста: один инструмент сканирует систему и сохраняет информацию о её состоянии, после другой сканирует систему на наличие изменений, сравнивая состояние в момент проверки с сохраненным.
composer require nomelodic/file-system-security
Объявляем класс и передаем массив с настройками.
$security = new FilesSecurity([
'baseDir' => __DIR__,
'include' => ['f|*.php'],
'includeMerge' => ['d|*.js'],
'exclude' => ['f|sitemap.xml'],
'excludeMerge' => ['d|vendor'],
'callback' => function ($status, $diff) {
/* Здесь выполняем необходимые действия */
}
]);
baseDir string required - Корневая директория проекта. Это та директория, внутри которой будет собираться список файлов.
include array - Массив со списком масок и названий файлов и папок, которые участвуют в обходе. Заменяет дефолтный список.
includeMerge array - Массив со списком масок и названий файлов и папок, которые участвуют в обходе. Объединяется с дефолтным списком.
exclude array - Массив со списком масок и названий файлов и папок, которые не участвуют в обходе. Заменяет дефолтный список.
excludeMerge array - Массив со списком масок и названий файлов и папок, которые не участвуют в обходе. Объединяется с дефолтным списком.
Обратите внимание! В парах include | includeMerge
и exclude | excludeMerge
указывается что-то одно, т.е. либо include
, либо includeMerge
и, соотвественно, либо exclude
, либо excludeMerge
.
По-умолчанию у класса есть дефолтные списки:
$include = ['f|*.php', 'f|*.html', 'f|.env', 'f|.htaccess', 'f|*.sh', 'f|*.bat'];
$exclude = ['d|.git', 'd|.idea', 'd|.buildpath', 'd|.project', 'd|.settings'];
Свои списки необходимо передавать в таком же виде. Каждый элемент списка состоит из двух частей, разделенных |
: тип файла (f - файл
или d - папка
) и название файла (полное или маска). На данный момент маска принимает только *
, т.е. не работает, как полноценное регулярное выражение.
Список файлов и папок, участвующих в обходе:
f|*.php // Все файлы с расширением .php
f|*.html // Все файлы с расширением .html
f|.env // Все файлы с именем .env
f|.htaccess // Все файлы с именем .htaccess
f|*.sh // Все файлы с расширением .sh
f|*.bat // Все файлы с расширением .bat
Список файлов и папок, не участвующих в обходе:
d|.git // Папка с именем .git и все дочерние элементы
d|.idea // Папка с именем .idea и все дочерние элементы
d|.buildpath // Папка с именем .buildpath и все дочерние элементы
d|.project // Папка с именем .project и все дочерние элементы
d|.settings // Папка с именем .settings и все дочерние элементы
callback callable - Функция, которая будет вызвана при завершении обхода. Принимает 2 параметра: $status
и $diff
.
function ($status, $diff) {
/* Здесь выполняем необходимые действия */
}
$status bool - Возвращает результат проверки контрольной суммы.
$diff array - Возвращает список измененных файлов, если результат проверки false.
Для работы используются 2 метода:
scan void - Производит сканирование системы и сохраняет слепок. Вызов:
$security->scan();
По итогу обхода создает файл fs_checksum
, в котором сохраняет состояние системы.
check array|callable - Проверяет систему на наличие изменений. Также дополнительно проверяет созданные и измененные файлы на наличие нежелательных вхождений. Вызов:
$security->check();
Если в настройках была передана функция callback, то выполнит её, иначе вернет ассоциативный массив с теми же параметрами, которые передаются в функцию:
[
'status' => true|false, // Результат проверки контрольной суммы
'diff' => [...] // Список измененных файлов
]
[
'created' => [ // Список созданных (новых) файлов
'index.html' => [
'new' => [ // Новые значения
'modified' => 1611595416, // Время последнего изменения в UNIX-формате
'size' => 128832, // Размер в байтах
'warnings' => [] // Нежелательных вхождений не обнаружено
],
]
],
'modified' => [ // Список измененных файлов
'controllers/SiteController.php' => [
'old' => [ // Старые значения
'modified' => 1611591377, // Время последнего изменения в UNIX-формате
'size' => 47565 // Размер в байтах
],
'new' => [ // Новые значения
'modified' => 1611598416, // Время последнего изменения в UNIX-формате
'size' => 47832, // Размер в байтах
'warnings' => [ // Список нежелательных вхождений
'key' => 'file_put_contents',
'string' => '...nclude ], 'list' => $files ]; file_put_contents($this->getChecksumPath(), jso...'
'offset' => 1930
]
],
]
],
'deleted' => [ // Список удаленных файлов
'.htaccess' => [
'old' => [ // Старые значения
'modified' => 1565950550, // Время последнего изменения в UNIX-формате
'size' => 84 // Размер в байтах
],
]
]
]
Расшифровка данных по нежелательным вхождениям:
key string - Вхождение. На данный момент обозначены:
private $warnings = [
'exec',
'chmod',
'mkdir',
'file_put_contents',
'fwrite',
'$GLOBAL',
'base64_decode',
'getenv',
'set_time_limit',
'rmdir',
'mail',
'curl_init',
'header',
];
string string - Часть строки из файла, где найдено вхождение
offset int - Смещение от начала файла (при проверке все табуляции и переносы строк заменяются на пробелы, после чего все повторяющиеся пробелы сокращаются до одного)