nomelodic/file-system-security

The library creates a snapshot of the project file system and calculates the checksum.

0.3 2021-01-28 19:44 UTC

This package is auto-updated.

Last update: 2024-09-29 05:56:17 UTC


README

Packagist Version

Многие сайты подвергаются взлому, и очень часто владельцы сайтов узнают об этом не сразу. Безусловно, для избежания подобного необходимо обеспечить безопасность сайта должным образом, убирать все дыры, проверять входящие данные и т.д. Но далеко не всегда разработчику удаётся это сделать, т.к. в проектах очень часто используются пакеты, плагины, расширения и пр. подобные вещи сторонних разработчиков. Уязвимости могут быть в любом месте.

Библиотека создает слепок файловой системы проекта и считает контрольную сумму. Это необходимо для контроля несанкционированных изменений файлов веб-проекта. Суть работы скрипта очень проста: один инструмент сканирует систему и сохраняет информацию о её состоянии, после другой сканирует систему на наличие изменений, сравнивая состояние в момент проверки с сохраненным.

Установка

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-функция

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'   => [...]       // Список измененных файлов
]

Пример возвращаемых данных в массиве $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 - Смещение от начала файла (при проверке все табуляции и переносы строк заменяются на пробелы, после чего все повторяющиеся пробелы сокращаются до одного)