키 포인트
CREATE TABLE integrity_hashes ( file_path VARCHAR(200) NOT NULL, file_hash CHAR(40) NOT NULL, PRIMARY KEY (file_path) );
스토리지 서버의 파일 경로는 값이 항상 고유하므로 (파일이 파일 시스템에서 동일한 위치를 차지할 수 없기 때문에) 기본 키입니다. 최대 길이를 200 자로 지정하여 더 긴 파일 경로를 허용해야합니다. file_path
file_hash
파일을 수집
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
RecursiveDirectoryIterator
로 수행 한 작업 대신 원치 않는 항목을 필터링하는 데 사용할 수 있습니다. 실행 후 코드는 다음과 유사한 결과로
valid()
isDot()
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!