溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2021-09-04 15:33:04 來源:億速云 閱讀:118 作者:chen 欄目:編程語言

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

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

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

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

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

我們先來看下數(shù)據(jù)庫應(yīng)該如何設(shè)計(jì)。為了安全起見,我們應(yīng)該單獨(dú)建立一個數(shù)據(jù)庫以存放需要保護(hù)文件的。如果讀者的網(wǎng)站是托管網(wǎng)站的話,建議使用cPanel去創(chuàng)建數(shù)據(jù)庫并且使用強(qiáng)密碼(比如可以用strongpasswordgenerator.com這個網(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表中,包含了一個長度很大的字段file_path,存放的是要保護(hù)文件的在服務(wù)器上的路徑,而file_hash(用40位的長度去進(jìn)行SHA1算法),而acct字段則表示是否監(jiān)視賬號還是域名。我們并將file_path設(shè)置為主鍵。

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

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

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

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

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

以及一些其他變量如下:

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

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

此外還有幾個參數(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()) {     //        忽略不需要檢測的目錄     if (!$iter->isDot() && !in_array($iter->getSubPath(), $skip))     {         // 獲得指定要檢測文件的擴(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 {             //          針對要忽略檢查的文件             $files[$iter->key()] = hash_file("sha1", $iter->key());         }     }     $iter->next(); } ?>

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

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

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

$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"; }

接下來,要對比的是經(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ù)組或者是空的或者會包含改變了的文件(刪除,修改,增加)和它們的哈希值。

然后我們可以將結(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'"); //  將新文件和對應(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)定時地執(zhí)行這個php文件,可以充分利用unix中的cron任務(wù)計(jì)劃,因此可以編寫cron的文件如下:

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

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

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI