如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改

這篇文章主要介紹“如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改”,在日常操作中,相信很多人在如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對(duì)大家解答”如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司主營平度網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,APP應(yīng)用開發(fā),平度h5成都微信小程序搭建,平度網(wǎng)站營銷推廣歡迎平度等地區(qū)企業(yè)咨詢

網(wǎng)絡(luò)安全一直是業(yè)界永恒的話題,人們一直在與黑客之間進(jìn)行著從不間斷的較量。那么作為普通的一個(gè)網(wǎng)站如何能用最簡單的方法去防止自己的網(wǎng)頁被篡改呢?或者至少在當(dāng)自己的網(wǎng)頁被篡改后能以最快的速度得知呢?在本文中,將介紹使用Cron和Php結(jié)合的方法,檢查某些指定的網(wǎng)頁是否被篡改。

這個(gè)方法的核心思路其實(shí)很簡單:“創(chuàng)建一個(gè)簡單的數(shù)據(jù)庫,其中保存了需要保護(hù)的文件的hash值,并且采用unix的cron調(diào)度方法,定期檢測(cè)實(shí)際文件的hash值和原始文件的hash值,并且形成報(bào)告。”

當(dāng)然,其中要涉及遞歸遍歷服務(wù)器文件目錄下的大量文件,并且要計(jì)算它們的hash值,下面將具體講解其過程。

數(shù)據(jù)庫設(shè)計(jì)

我們先來看下數(shù)據(jù)庫應(yīng)該如何設(shè)計(jì)。為了安全起見,我們應(yīng)該單獨(dú)建立一個(gè)數(shù)據(jù)庫以存放需要保護(hù)文件的。如果讀者的網(wǎng)站是托管網(wǎng)站的話,建議使用cPanel去創(chuàng)建數(shù)據(jù)庫并且使用強(qiáng)密碼(比如可以用strongpasswordgenerator.com這個(gè)網(wǎng)站去產(chǎn)生各長度位數(shù)的密碼,至少要8位以上)。我們將數(shù)據(jù)庫命名為 baseline,表設(shè)計(jì)如下:

CREATE TABLE baseline (         file_path VARCHAR(200) NOT NULL,         file_hash CHAR(40) NOT NULL,         acct VARCHAR(40) NOT NULL         PRIMARY KEY (file_path)     );       CREATE TABLE tested (         tested DATETIME NOT NULL,         account VARCHAR(40) NOT NULL         PRIMARY KEY (tested)     );

在baseline表中,包含了一個(gè)長度很大的字段file_path,存放的是要保護(hù)文件的在服務(wù)器上的路徑,而file_hash(用40位的長度去進(jìn)行SHA1算法),而acct字段則表示是否監(jiān)視賬號(hào)還是域名。我們并將file_path設(shè)置為主鍵。

而tested表中的tested字段則保存每次掃描的具體時(shí)間,而account字段和baseline表的acct字段是相同的,以允許分別單獨(dú)掃描賬號(hào)還是域名。

定義PHP文件前的一些準(zhǔn)備工作

接下來,我們?yōu)殚_發(fā)php文件做一些準(zhǔn)備工作,首先要定義一些php文件中要用到的常量。

PATH。這個(gè)是要在你的服務(wù)器上進(jìn)行掃描的起始路徑,通常是指代DocumentRoot。記得不要使用Windows中的反斜杠因?yàn)锳pache和PHP都使用的是正向的斜杠。

訪問數(shù)據(jù)庫要涉及的地址,用戶密碼等參數(shù),如SERVER ('localhost'), USER, PASSWORD and DATABASE

以及一些其他變量如下:

保存需要檢查文件擴(kuò)展名的數(shù)組。在這個(gè)例子中,只用數(shù)組保存了如.php、.htm和.js格式的文件。在本文中,如果使用了一個(gè)空的數(shù)組,則默認(rèn)檢查所有格式的文件(這是最安全的,但耗費(fèi)不少資源)。

需要排除檢查的目錄。一般不建議這么做,如果確實(shí)需要不檢查某個(gè)目錄,則可以將其放置在本文中的一個(gè)數(shù)組中

此外還有幾個(gè)參數(shù)需要設(shè)置,包括$file數(shù)組,初始化為空,$report初始化為空字符串以及$act字符串(配合數(shù)據(jù)表中的account/acct字段使用)。

開始編碼

下面我們正式編碼,先看如下代碼:

<?php //初始化 $ext = array("php","html","js"); //skip保存要忽略檢查的文件夾    $skip = array("protected"); //  use define statements or enter values directly in the MySQLi_connect define('SERVER','localhost'); define('USER','your user name'); define('PASS','your password'); define('DATABASE','database name');  $db = mysqli_connect(SERVER,USER,PASS,DATABASE); $dir = new RecursiveDirectoryIterator(PATH); $iter = new RecursiveIteratorIterator($dir); while ($iter->valid()) {     //        忽略不需要檢測(cè)的目錄     if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip))     {         // 獲得指定要檢測(cè)文件的擴(kuò)展名         if (!emptyempty($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 {             //          針對(duì)要忽略檢查的文件             $files[$iter->key()] = hash_file("sha1", $iter->key());         }     }     $iter->next(); } ?>

下面我們來講解下上面的代碼。首先,使用的是php中的兩個(gè)內(nèi)置函數(shù)RecursiveDirectoryIterator(獲得指定目錄下的所有文件和目錄),然后進(jìn)行循環(huán)遍歷,并且檢查每一個(gè)目錄是否在需要排除檢測(cè)的目錄之中,如果包含在檢測(cè)列表中的話同時(shí)檢測(cè)是否有需要排除檢測(cè)的文件。***將最終需要檢測(cè)的文件放置在數(shù)組$files中,這個(gè)數(shù)組的鍵為文件的名稱,而值則為經(jīng)過SHA1算法運(yùn)算后的哈希值。所以文件的數(shù)量可以馬上通過以下方法獲得

$report .= "Files has " . count($files) . " records.\r\n";

然后,我們要從tested表中,獲得***一次經(jīng)過哈希掃描的文件的時(shí)間,如下代碼:

$results = mysqli_query($db,"SELECT tested FROM tested WHERE acct = '$acct'      ORDER BY tested DESC LIMIT 1"); if ($results) {     while($result=mysqli_fetch_array($results))     {         $tested = $result['tested'];     } $report .= "Last tested $tested.\r\n"; }

接下來,要對(duì)比的是經(jīng)過hash掃描的文件的***hash值和原來baseline表中的文件的哈希值是否有改變,使用的代碼如下:

if (!emptyempty($files))  {     $result = mysqli_query($db,"SELECT * FROM baseline");     if (!emptyempty($result))      {         foreach ($result as $value)          {             $baseline[$value["file_path"]] = $value["file_hash"];         }         $diffs = array_diff_assoc($files, $baseline);         unset($baseline);     } } //  分別將不相同的部分保存到 Deleted, Altered 和 Added 數(shù)組 if (!emptyempty($files))  {     $results = mysqli_query($db,"SELECT file_path, file_hash FROM baseline WHERE acct = '$acct'");     if (!emptyempty($results))      {         $baseline = array();    //  from database         $diffs = array();       //  $files 和 $baseline數(shù)組的不同             while ($value = mysqli_fetch_array($results))         {             if (!array_key_exists($value["file_path"], $files))              {                 //  刪除了的文件                 $diffs["Deleted"][$value["file_path"]] = $value["file_path"];                 $baseline[$value["file_path"]] = $value["file_hash"];             } else {                 //  改變過的文件                 if ($files[$value["file_path"]] <> $value["file_hash"])                  {                     $diffs["Altered"][$value["file_path"]] = $value["file_path"];                     $baseline[$value["file_path"]] = $value["file_path"];                 } else {                     //  沒改變的文件                     $baseline[$value["file_path"]] = $value["file_hash"];                 }             }         }         if (count($baseline) < count($files))          {             //  增加的文件             $diffs["Added"] = array_diff_assoc($files, $baseline);         }         unset($baseline);     } }

當(dāng)上面這段代碼執(zhí)行完畢后,$diffs數(shù)組或者是空的或者會(huì)包含改變了的文件(刪除,修改,增加)和它們的哈希值。

然后我們可以將結(jié)果通過EMAIL發(fā)送給用戶了。代碼如下:

if (!emptyempty($diffs)) { $report .= "The following discrepancies were found:\r\n\r\n"; foreach ($diffs as $status => $affected)  {     if (is_array($affected) && !emptyempty($affected))      {         $report .= "* $status *\r\n\r\n";         foreach($affected as $path => $hash) $report .= " ?$path\r\n";     } } } else {     $report .= "File structure is intact.\r\n"; } $mailed = mail('you@example.com', $acct . ' Integrity Monitor Report',$report);

并且要更新baseline表和tested表的數(shù)據(jù),代碼如下:

// 清除舊數(shù)據(jù) mysqli_query($db,"DELETE FROM baseline WHERE acct = '$acct'"); //  將新文件和對(duì)應(yīng)的hash值加入 foreach ($files as $path => $hash)  {     mysqli_query($db,"INSERT INTO baseline (file_path, file_hash, acct)          VALUES ('$path','$hash', '$acct')"); } mysqli_query($db,"INSERT INTO tested (tested, acct) VALUES (NOW(), '$acct')"); mysqli_close($db);

***,為了能讓系統(tǒng)定時(shí)地執(zhí)行這個(gè)php文件,可以充分利用unix中的cron任務(wù)計(jì)劃,因此可以編寫cron的文件如下:

/usr/local/bin/php -q /home/account/hashscan.php

其中,/usr/local/bin/php就是你服務(wù)器上php的路徑,可以根據(jù)實(shí)際情況設(shè)置每天隔多久去檢測(cè)一下服務(wù)器上的文件(這可以通過編寫cron表達(dá)式去實(shí)現(xiàn),關(guān)于如何編寫cron表達(dá)式,讀者可以參考相關(guān)的資料)。

到此,關(guān)于“如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

本文名稱:如何使用Cron和PHP檢測(cè)網(wǎng)頁是否被篡改
文章源于:http://muchs.cn/article48/ihidhp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)響應(yīng)式網(wǎng)站、網(wǎng)站收錄、App開發(fā)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計(jì)公司