iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何使用Cron和PHP检测网页是否被篡改
  • 549
分享到

如何使用Cron和PHP检测网页是否被篡改

2023-06-17 08:06:09 549人浏览 八月长安
摘要

这篇文章主要介绍“如何使用Cron和PHP检测网页是否被篡改”,在日常操作中,相信很多人在如何使用Cron和php检测网页是否被篡改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Cron和PHP检测网

这篇文章主要介绍“如何使用Cron和PHP检测网页是否被篡改”,在日常操作中,相信很多人在如何使用Cron和php检测网页是否被篡改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Cron和PHP检测网页是否被篡改”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

网络安全一直是业界永恒的话题,人们一直在与黑客之间进行着从不间断的较量。那么作为普通的一个网站如何能用最简单的方法去防止自己的网页被篡改呢?或者至少在当自己的网页被篡改后能以最快的速度得知呢?在本文中,将介绍使用Cron和Php结合的方法,检查某些指定的网页是否被篡改。

这个方法的核心思路其实很简单:“创建一个简单的数据库,其中保存了需要保护的文件的hash值,并且采用unix的cron调度方法,定期检测实际文件的hash值和原始文件的hash值,并且形成报告。”

当然,其中要涉及递归遍历服务器文件目录下的大量文件,并且要计算它们的hash值,下面将具体讲解其过程。

数据库设计

我们先来看下数据库应该如何设计。为了安全起见,我们应该单独建立一个数据库以存放需要保护文件的。如果读者的网站是托管网站的话,建议使用cPanel去创建数据库并且使用强密码(比如可以用strongpassWordgenerator.com这个网站去产生各长度位数的密码,至少要8位以上)。我们将数据库命名为 baseline,表设计如下:

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,存放的是要保护文件的在服务器上的路径,而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字段使用)。

开始编码

下面我们正式编码,先看如下代码:

<?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))     {         // 获得指定要检测文件的扩展名         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中的两个内置函数RecursiveDirectoryIterator(获得指定目录下的所有文件和目录),然后进行循环遍历,并且检查每一个目录是否在需要排除检测的目录之中,如果包含在检测列表中的话同时检测是否有需要排除检测的文件。***将最终需要检测的文件放置在数组$files中,这个数组的键为文件的名称,而值则为经过SHA1算法运算后的哈希值。所以文件的数量可以马上通过以下方法获得

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

然后,我们要从tested表中,获得***一次经过哈希扫描的文件的时间,如下代码:

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

接下来,要对比的是经过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 数组 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数组的不同             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);     } }

当上面这段代码执行完毕后,$diffs数组或者是空的或者会包含改变了的文件(删除,修改,增加)和它们的哈希值。

然后我们可以将结果通过EMaiL发送给用户了。代码如下:

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表的数据,代码如下:

// 清除旧数据 mysqli_query($db,"DELETE FROM baseline WHERE acct = '$acct'"); //  将新文件和对应的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);

***,为了能让系统定时地执行这个php文件,可以充分利用unix中的cron任务计划,因此可以编写cron的文件如下:

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

其中,/usr/local/bin/php就是你服务器上php的路径,可以根据实际情况设置每天隔多久去检测一下服务器上的文件(这可以通过编写cron表达式去实现,关于如何编写cron表达式,读者可以参考相关的资料)。

到此,关于“如何使用Cron和PHP检测网页是否被篡改”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 如何使用Cron和PHP检测网页是否被篡改

本文链接: https://www.lsjlt.com/news/287934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Cron和PHP检测网页是否被篡改
    这篇文章主要介绍“如何使用Cron和PHP检测网页是否被篡改”,在日常操作中,相信很多人在如何使用Cron和PHP检测网页是否被篡改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Cron和PHP检测网...
    99+
    2023-06-17
  • ajax如何检测用户名是否被占用
    这篇文章主要讲解了“ajax如何检测用户名是否被占用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ajax如何检测用户名是否被占用”吧!代码如下://检测用...
    99+
    2024-04-02
  • 美国服务器如何检测网站是否被挂马
    可以借助网站挂马检测工具进行排查,比如:1、百度网站安全检测工具,能够快速帮助用户解决网站安全问题;2、百度云观测工具,具备7x24小时网站监测和报警服务,帮助用户及时发现网站问题;3、360网站安全检测工具,该工具是免费的,能够帮助用户实...
    99+
    2024-04-02
  • 如何利用Ajax检测用户名是否被占用
    小编给大家分享一下如何利用Ajax检测用户名是否被占用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!采用Ajax实现用户名验证使用jQuery给出提示信息用户注册...
    99+
    2023-06-08
  • Java如何使用openssl检测网站是否支持ocsp
    这篇文章主要介绍“Java如何使用openssl检测网站是否支持ocsp”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java如何使用openssl检测网站是否支持ocsp”文章能帮助大家解决问题。...
    99+
    2023-07-02
  • 如何使用PHP来修改网页
    这篇文章主要介绍了如何使用PHP来修改网页的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用PHP来修改网页文章都会有所收获,下面我们一起来看看吧。基本语法PHP可以与HTML混合使用,其语法与HTML类似...
    99+
    2023-07-05
  • 如何使用PHP进行图像识别和物体检测?
    随着人工智能技术的不断发展,图像识别与物体检测已成为热门的研究方向。而在实践中,PHP作为一种流行的脚本语言,也可以用于图像识别和物体检测。本文将介绍如何使用PHP进行图像识别和物体检测。一、PHP图像处理库在使用PHP进行图像识别和物体检...
    99+
    2023-05-23
    PHP 图像识别 物体检测
  • Java如何使用httpclient检测url状态及链接是否能打开
    目录使用httpclient检测url状态及链接是否能打开需要使用到的mavenHTTPClient调用远程URL实例案例描述使用httpclient检测url状态及链接是否能打开 ...
    99+
    2024-04-02
  • 如何使用PHP来检验值是否在二维数组中
    在PHP中,二维数组是非常常见的数据结构。在实际开发中,我们有时需要判断某个值是否在二维数组中。本文将介绍如何使用PHP来检验值是否在二维数组中。方法一:使用foreach循环使用foreach循环遍历二维数组,逐一比较每个值,如果二维数组...
    99+
    2023-05-14
  • 微信域名拦截查询之如何使用网址被屏蔽检测api接口
    这篇文章将为大家详细讲解有关微信域名拦截查询之如何使用网址被屏蔽检测api接口,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景公司是做文学相关的业务,在微信上做营销推广的时候,经常发现域名被微信屏蔽了,...
    99+
    2023-06-05
  • 如何使用PHP在网页中修改数据库的内容
    PHP是一种脚本语言,常用于编写动态交互式网页。与静态网页不同,动态网页的内容可以随时更新,通过与数据库交互,实现对网站内容的实时修改。本文将介绍如何使用PHP在网页中修改数据库的内容。首先,需要在网页中连接数据库。在PHP中,可以使用my...
    99+
    2023-05-14
    php
  • 如何使用Ajax实时检测"用户名、邮箱等"是否已经存在
    本篇内容主要讲解“如何使用Ajax实时检测"用户名、邮箱等"是否已经存在”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用Ajax实时检...
    99+
    2024-04-02
  • 如何利用官方的微信域名检测API接口监控域名在微信中是否被屏蔽
    如何利用官方的微信域名检测API接口监控域名在微信中是否被屏蔽,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。背景由于微信限制比较严格,域名很容易会被判定一下几种情况:1、诱导分...
    99+
    2023-06-05
  • 您是否知道如何在框架中使用 PHP、Bash 和 NumPy?
    PHP、Bash 和 NumPy 是三种非常流行的编程语言和框架。它们都有着各自的特点和优势,但是当它们结合在一起时,可以实现更加强大的功能。在本文中,我们将介绍如何在框架中使用 PHP、Bash 和 NumPy,以及它们的优势和示例代码。...
    99+
    2023-08-20
    bash numpy 框架
  • PHP如何使用三元运算符测试数字是否大于指定数
    这篇文章主要为大家展示了“PHP如何使用三元运算符测试数字是否大于指定数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP如何使用三元运算符测试数字是否大于指定数”这篇文章吧。首先简单给大家介...
    99+
    2023-06-20
  • 您是否知道如何在PHP中使用缓存和JavaScript实时来优化网站?
    PHP和JavaScript是两种常用的网站开发语言,它们的优化对于网站的性能至关重要。使用缓存和实时JavaScript技术可以帮助优化网站的性能,提高用户体验。本文将讨论如何在PHP中使用缓存和JavaScript实时来优化网站。 一、...
    99+
    2023-09-23
    缓存 javascript 实时
  • 如何自动判断域名是否被微信拦截 被微信屏蔽的域名网址如何正常打开使用
    网站域名被微信封杀拦截怎么解决?如何防止微信封域名?点击域名在微信上提示 三种常见情况:1、已停止访问该页面。据用户投诉及腾讯手机管家云网址检测,该网页可能包含恶意欺诈内容。2、已停止访问该网页。网页包含诱导分享、诱导关注内容,被多人投诉,...
    99+
    2023-06-04
  • PHP 和 NumPy:您是否知道如何使用它们来优化 Web 响应?
    在 Web 开发中,响应速度是至关重要的。用户不愿意等待很长时间来加载页面或执行操作。为了优化 Web 响应,可以使用各种工具和技术,其中包括 PHP 和 NumPy。 PHP 是一种流行的服务器端编程语言,广泛用于 Web 开发。它提供...
    99+
    2023-08-30
    numy numpy 响应
  • PHP和Spring如何使用缓存技术来提高性能?Shell是否有帮助?
    随着互联网的快速发展,越来越多的网站和应用程序需要处理大量的数据。为了提高应用程序的性能,缓存技术成为了一种非常有效的解决方案。在本文中,我们将探讨PHP和Spring如何使用缓存技术来提高性能,并且看一下Shell是否有帮助。 一、PH...
    99+
    2023-06-29
    spring 缓存 shell
  • 是否可以在 hyperledger-chaincode 中使用 gRPC,如果可以,如何避免在测试网络上调用期间出现错误?
    php小编西瓜在这里回答你的问题。是的,你可以在Hyperledger Chaincode中使用gRPC。gRPC是一种高性能、开源的远程过程调用(RPC)框架,它可以使您的Chain...
    99+
    2024-02-13
    区块链
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作