使用Cron和PHP检测网页是否被篡改_PHP教程
网络安全一直是业界永恒的话题,人们一直在与黑客之间进行着从不间断的较量。那么作为普通的一个网站如何能用最简单的方法去防止自己的网页被篡改呢?或者至少在当自己的网页被篡改后能以最快的速度得知呢?在本文中,将介绍使用Cron和Php结合的方法,检查某些指定的网页是否被篡改。
这个方法的核心思路其实很简单:“创建一个简单的数据库,其中保存了需要保护的文件的hash值,并且采用unix的cron调度方法,定期检测实际文件的hash值和原始文件的hash值,并且形成报告。”
当然,其中要涉及递归遍历服务器文件目录下的大量文件,并且要计算它们的hash值,下面将具体讲解其过程。
数据库设计
我们先来看下数据库应该如何设计。为了安全起见,我们应该单独建立一个数据库以存放需要保护文件的。如果读者的网站是托管网站的话,建议使用cPanel去创建数据库并且使用强密码比如可以用strongpasswordgenerator.com这个网站去产生各长度位数的密码,至少要8位以上)。我们将数据库命名为 baseline,表设计如下:
<ol class="dp-c"> <li class="alt"><span><span>CREATE TABLE baseline ( </span></span></li> <li><span> file_path VARCHAR(200) NOT NULL, </span></li> <li class="alt"><span> file_hash CHAR(40) NOT NULL, </span></li> <li><span> acct VARCHAR(40) NOT NULL </span></li> <li class="alt"><span> PRIMARY KEY (file_path) </span></li> <li><span> ); </span></li> <li class="alt"><span> </span></li> <li><span> CREATE TABLE tested ( </span></li> <li class="alt"><span> tested DATETIME NOT NULL, </span></li> <li><span> account VARCHAR(40) NOT NULL </span></li> <li class="alt"><span> PRIMARY KEY (tested) </span></li> <li><span> ); </span></li> </ol>
在baseline表中,包含了一个长度很大的字段file_path,存放的是要保护文件的在服务器上的路径,而file_hash用40位的长度去进行SHA1算法),而acct字段则表示是否监视账号还是域名。我们并将file_path设置为主键。
而tested表中的tested字段则保存每次扫描的具体时间,而account字段和baseline表的acct字段是相同的,以允许分别单独扫描账号还是域名。
定义PHP文件前的一些准备工作
接下来,我们为开发php文件做一些准备工作,首先要定义一些php文件中要用到的常量。
PATH。这个是要在你的服务器上进行扫描的起始路径,通常是指代DocumentRoot。记得不要使用Windows中的反斜杠因为Apache和PHP都使用的是正向的斜杠。
访问数据库要涉及的地址,用户密码等参数,如SERVER ('localhost'), USER, PASSWORD and DATABASE
以及一些其他变量如下:
保存需要检查文件扩展名的数组。在这个例子中,只用数组保存了如.php、.htm和.js格式的文件。在本文中,如果使用了一个空的数组,则默认检查所有格式的文件这是最安全的,但耗费不少资源)。
需要排除检查的目录。一般不建议这么做,如果确实需要不检查某个目录,则可以将其放置在本文中的一个数组中
此外还有几个参数需要设置,包括$file数组,初始化为空,$report初始化为空字符串以及$act字符串配合数据表中的account/acct字段使用)。
开始编码
下面我们正式编码,先看如下代码:
<ol class="dp-c"> <li class="alt"><span><span><?php </span></span></span></li> <li><span><span class="comment">//初始化</span><span> </span></span></li> <li class="alt"><span><span class="vars">$ext</span><span> = </span><span class="keyword">array</span><span>(</span><span class="string">"php"</span><span>,</span><span class="string">"html"</span><span>,</span><span class="string">"js"</span><span>); </span></span></li> <li><span><span class="comment">//skip保存要忽略检查的文件夹 </span><span> </span></span></li> <li class="alt"><span><span class="vars">$skip</span><span> = </span><span class="keyword">array</span><span>(</span><span class="string">"protected"</span><span>); </span></span></li> <li><span><span class="comment">// use define statements or enter values directly in the mysqli_connect</span><span> </span></span></li> <li class="alt"><span>define(<span class="string">'SERVER'</span><span>,</span><span class="string">'localhost'</span><span>); </span></span></li> <li><span>define(<span class="string">'USER'</span><span>,</span><span class="string">'your user name'</span><span>); </span></span></li> <li class="alt"><span>define(<span class="string">'PASS'</span><span>,</span><span class="string">'your password'</span><span>); </span></span></li> <li><span>define(<span class="string">'DATABASE'</span><span>,</span><span class="string">'database name'</span><span>); </span></span></li> <li class="alt"><span> </span></li> <li><span><span class="vars">$db</span><span> = mysqli_connect(SERVER,USER,PASS,DATABASE); </span></span></li> <li class="alt"><span><span class="vars">$dir</span><span> = </span><span class="keyword">new</span><span> RecursiveDirectoryIterator(PATH); </span></span></li> <li><span><span class="vars">$iter</span><span> = </span><span class="keyword">new</span><span> RecursiveIteratorIterator(</span><span class="vars">$dir</span><span>); </span></span></li> <li class="alt"><span><span class="keyword">while</span><span> (</span><span class="vars">$iter</span><span>->valid()) </span></span></li> <li><span>{ </span></li> <li class="alt"><span> <span class="comment">// 忽略不需要检测的目录</span><span> </span></span></li> <li><span> <span class="keyword">if</span><span> (!</span><span class="vars">$iter</span><span>->isDot() && !in_array(</span><span class="vars">$iter</span><span>->getSubPath(), </span><span class="vars">$skip</span><span>)) </span></span></li> <li class="alt"><span> { </span></li> <li><span> <span class="comment">// 获得指定要检测文件的扩展名</span><span> </span></span></li> <li class="alt"><span> <span class="keyword">if</span><span> (!</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$ext</span><span>)) </span></span></li> <li><span> { </span></li> <li class="alt"><span> <span class="comment">// PHP 5.3.4使用如下语句 if (in_array($iter->getExtension(), $ext))</span><span> </span></span></li> <li><span> <span class="keyword">if</span><span> (in_array(</span><span class="func">pathinfo</span><span>(</span><span class="vars">$iter</span><span>->key(), PATHINFO_EXTENSION), </span><span class="vars">$ext</span><span>)) </span></span></li> <li class="alt"><span> { </span></li> <li><span> <span class="vars">$files</span><span>[</span><span class="vars">$iter</span><span>->key()] = hash_file(</span><span class="string">"sha1"</span><span>, </span><span class="vars">$iter</span><span>->key()); </span></span></li> <li class="alt"><span> } </span></li> <li><span> } <span class="keyword">else</span><span> { </span></span></li> <li class="alt"><span> <span class="comment">// 针对要忽略检查的文件</span><span> </span></span></li> <li><span> <span class="vars">$files</span><span>[</span><span class="vars">$iter</span><span>->key()] = hash_file(</span><span class="string">"sha1"</span><span>, </span><span class="vars">$iter</span><span>->key()); </span></span></li> <li class="alt"><span> } </span></li> <li><span> } </span></li> <li class="alt"><span> <span class="vars">$iter</span><span>->next(); </span></span></li> <li><span>} </span></li> <li class="alt"><span>?> </span></li> </ol>
下面我们来讲解下上面的代码。首先,使用的是php中的两个内置函数RecursiveDirectoryIterator(获得指定目录下的所有文件和目录),然后进行循环遍历,并且检查每一个目录是否在需要排除检测的目录之中,如果包含在检测列表中的话同时检测是否有需要排除检测的文件。最后将最终需要检测的文件放置在数组$files中,这个数组的键为文件的名称,而值则为经过SHA1算法运算后的哈希值。所以文件的数量可以马上通过以下方法获得
<ol class="dp-c"><li class="alt"><span><span class="vars">$report</span><span> .= </span><span class="string">"Files has "</span><span> . </span><span class="func">count</span><span>(</span><span class="vars">$files</span><span>) . </span><span class="string">" records.\r\n"</span><span>; </span></span></li></ol>
然后,我们要从tested表中,获得最新一次经过哈希扫描的文件的时间,如下代码:
<ol class="dp-c"> <li class="alt"><span><span class="vars">$results</span><span> = mysqli_query(</span><span class="vars">$db</span><span>,"SELECT tested FROM tested WHERE acct = </span><span class="string">'$acct'</span><span> </span></span></li> <li><span> ORDER BY tested DESC LIMIT 1"); </span></li> <li class="alt"><span><span class="keyword">if</span><span> (</span><span class="vars">$results</span><span>) </span></span></li> <li><span>{ </span></li> <li class="alt"><span> <span class="keyword">while</span><span>(</span><span class="vars">$result</span><span>=mysqli_fetch_array(</span><span class="vars">$results</span><span>)) </span></span></li> <li><span> { </span></li> <li class="alt"><span> <span class="vars">$tested</span><span> = </span><span class="vars">$result</span><span>[</span><span class="string">'tested'</span><span>]; </span></span></li> <li><span> } </span></li> <li class="alt"><span><span class="vars">$report</span><span> .= </span><span class="string">"Last tested $tested.\r\n"</span><span>; </span></span></li> <li><span>} </span></li> </ol>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.
