>백엔드 개발 >PHP 튜토리얼 >PHP 마스터 | 파일 무결성 모니터링

PHP 마스터 | 파일 무결성 모니터링

Christopher Nolan
Christopher Nolan원래의
2025-03-03 08:26:131001검색

PHP Master | Monitoring File Integrity 키 포인트

파일 모니터링은 웹 사이트 관리에 필수적이며 파일이 추가, 수정, 삭제 또는 손상된시기를 감지하는 데 도움이됩니다. 파일의 내용을 해싱하는 것은 이러한 변경 사항을 모니터링하는 신뢰할 수있는 방법입니다. PHP의

함수를 사용하여 모니터링을위한 파일 구조 구성 파일을 작성할 수 있습니다. 각 파일의 해시 값은 나중에 비교를 위해 저장하여 변경 사항을 감지 할 수 있습니다. 먼저 파일의 해시 값을 저장하려면 기본 테이블을 레이아웃해야합니다. 다음 패턴을 사용하겠습니다
CREATE TABLE integrity_hashes (
    file_path VARCHAR(200) NOT NULL,
    file_hash CHAR(40) NOT NULL,
    PRIMARY KEY (file_path)
);

스토리지 서버의 파일 경로는 값이 항상 고유하므로 (파일이 파일 시스템에서 동일한 위치를 차지할 수 없기 때문에) 기본 키입니다. 최대 길이를 200 자로 지정하여 더 긴 파일 경로를 허용해야합니다. 는 파일의 해시 값을 저장하며, 이는 SHA-1 40-character 16 진수 문자열입니다. file_path file_hash 파일을 수집

다음 단계는 파일 구조에 대한 구성 파일을 빌드하는 것입니다. 파일 수집을 시작하는 경로를 정의하고 파일 시스템의 전체 브랜치를 덮어 쓸 때까지 각 디렉토리를 재귀 적으로 반복하고 특정 디렉토리 또는 파일 확장을 선택적으로 배제 할 수 있습니다. 파일 트리를 통과 할 때 필요한 해시 값을 수집 한 다음 데이터베이스 또는 비교를 위해 저장합니다. PHP는 파일 트리를 가로 지르는 몇 가지 방법을 제공합니다.

배열에서 동일한 폴더를 두 번 참조했다는 점에 유의하십시오. 특정 디렉토리를 무시하기로 선택했다고해서 반복자가 귀하의 요구에 따라 모든 하위 디렉터를 무시한다는 것을 의미하지는 않습니다.

클래스는 여러 가지 방법에 대한 액세스 권한을 제공합니다.

RecursiveDirectoryIterator 유효한 파일을 사용하고 있는지 확인하십시오

디렉토리가 "또는".. " 파일 포인터가 현재 위치한 폴더 이름으로 돌아갑니다
<?php
define("PATH", "/var/www/");
$files = array();

// 要获取的扩展名,空数组将返回所有扩展名
$ext = array("php");

// 要忽略的目录,空数组将检查所有目录
$skip = array("logs", "logs/traffic");

// 构建配置文件
$dir = new RecursiveDirectoryIterator(PATH);
$iter = new RecursiveIteratorIterator($dir);
while ($iter->valid()) {
    // 跳过不需要的目录
    if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip)) {
        // 获取特定文件扩展名
        if (!empty($ext)) {
            // PHP 5.3.4: if (in_array($iter->getExtension(), $ext)) {
            if (in_array(pathinfo($iter->key(), PATHINFO_EXTENSION), $ext)) {
                $files[$iter->key()] = hash_file("sha1", $iter->key());
            }
        } else {
            // 忽略文件扩展名
            $files[$iter->key()] = hash_file("sha1", $iter->key());
        }
    }
    $iter->next();
}

전체 경로와 파일 이름을 반환하십시오 루프를 다시 시작하십시오 $skip logs 더 많은 방법이 있지만, 대부분의 경우 위에 나열된 시간은 PHP 5.3.4에 추가되었지만 파일 확장자를 반환합니다. PHP 버전이 지원하는 경우 RecursiveDirectoryIterator로 수행 한 작업 대신 원치 않는 항목을 필터링하는 데 사용할 수 있습니다. 실행 후 코드는 다음과 유사한 결과로

배열을 채워야합니다.
    구성 파일을 구축 한 후 데이터베이스를 업데이트하기가 매우 쉽습니다.
  • valid()
  • 차이를 점검하십시오
  • isDot() 이제 디렉토리 구조에 대한 새 구성 파일을 작성하는 방법과 데이터베이스에서 레코드를 업데이트하는 방법을 알고 있습니다. 다음 단계는 이메일 알림, 관리자 인터페이스 또는 원하는 다른 것과 같은 CRON 작업과 같은 일종의 실제 응용 프로그램으로 결합하는 것입니다. 변경 방법을 돌보지 않고 변경된 파일 목록을 수집하려면 가장 쉬운 방법은 데이터베이스에서 데이터를 와 비슷한 배열로 추출하고 원치 않는 콘텐츠를 제거하기 위해 PHP의 함수를 사용하는 것입니다.
  • CREATE TABLE integrity_hashes (
        file_path VARCHAR(200) NOT NULL,
        file_hash CHAR(40) NOT NULL,
        PRIMARY KEY (file_path)
    );
    이 예에서

    는 발견 된 차이점으로 채워 지거나 파일 구조가 완료되면 빈 배열이됩니다. 와 달리 $diffs는 키를 비교하여 사용합니다. 이는 두 개의 빈 파일이 동일한 해시 값을 갖는 것과 같이 충돌 할 때 중요합니다. 한 걸음 더 나아가려면 파일이 삭제, 변경 또는 추가되는지 여부에 관계없이 파일의 영향을 받는지 정확하게 결정하기 위해 간단한 논리를 추가 할 수 있습니다. array_diff() array_diff_assoc() 데이터베이스에서 결과를 가로 질러 여러 번 확인합니다. 먼저

    를 사용하여 데이터베이스의 파일 경로가 에 나타나는지 확인하고 파일을 삭제해야합니다. 둘째, 파일이 존재하지만 해시가 일치하지 않으면 파일이 변경되었거나 변경되지 않아야합니다. 우리는 각 체크를 라는 임시 배열에 저장하고 마지막으로 의 숫자가 데이터베이스의 숫자보다 큰 경우 나머지 확인되지 않은 파일이 추가되었음을 알고 있습니다. 일단 완료되면
    <?php
    define("PATH", "/var/www/");
    $files = array();
    
    // 要获取的扩展名,空数组将返回所有扩展名
    $ext = array("php");
    
    // 要忽略的目录,空数组将检查所有目录
    $skip = array("logs", "logs/traffic");
    
    // 构建配置文件
    $dir = new RecursiveDirectoryIterator(PATH);
    $iter = new RecursiveIteratorIterator($dir);
    while ($iter->valid()) {
        // 跳过不需要的目录
        if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip)) {
            // 获取特定文件扩展名
            if (!empty($ext)) {
                // PHP 5.3.4: if (in_array($iter->getExtension(), $ext)) {
                if (in_array(pathinfo($iter->key(), PATHINFO_EXTENSION), $ext)) {
                    $files[$iter->key()] = hash_file("sha1", $iter->key());
                }
            } else {
                // 忽略文件扩展名
                $files[$iter->key()] = hash_file("sha1", $iter->key());
            }
        }
        $iter->next();
    }
    는 빈 배열이거나 다차원 배열 형태로 발견되는 차이점을 포함합니다.

    를 표시하려면보다 사용자 친화적 인 형식 (예 : 관리 인터페이스)을 표시하려면 결과를 반복하여 총알 목록으로 출력 할 수 있습니다. array_key_exists() $files 이 시점에서 새 파일 구조로 데이터베이스 업데이트 작업을 트리거 할 수있는 링크를 제공 할 수 있습니다 (이 경우 세션 변수에 $tmp를 저장하도록 선택할 수 있음) 또는 차이를 승인하지 않으면 필요에 따라 처리 할 수 ​​있습니다. $files 요약 $diffs

    이 안내서가 파일 무결성 모니터링을 더 잘 이해하는 데 도움이되기를 바랍니다. 웹 사이트에 이러한 콘텐츠를 설치하는 것은 귀중한 보안 조치이며 파일의 의도와 동일하게 유지 될 수 있습니다. 물론 정기적으로 백업하는 것을 잊지 마십시오. 경우에.
    <code>Array
    (
        [/var/www/test.php] => b6b7c28e513dac784925665b54088045cf9cbcd3
        [/var/www/sub/hello.php] => a5d5b61aa8a61b7d9d765e1daf971a9a578f1cfa
        [/var/www/sub/world.php] => da39a3ee5e6b4b0d3255bfef95601890afd80709
    )</code>

    (원본 텍스트의 FAQ 부분은 여기에서 유지되어야합니다.이 부분의 내용은 코드 부분과 관련이없고 보충 설명에 속하며 의사 원리의 범주에 속하지 않기 때문입니다)

    .

위 내용은 PHP 마스터 | 파일 무결성 모니터링의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Phpmaster | PHP 변수다음 기사:Phpmaster | PHP 변수