search
HomeBackend DevelopmentPHP Tutorial使用Cron和PHP检测网页是否被篡改_PHP教程

使用Cron和PHP检测网页是否被篡改_PHP教程

Jul 13, 2016 pm 05:18 PM
cronphppeopleuseandDetectionoftampercyber securityWeb pagehacker

网络安全一直是业界永恒的话题,人们一直在与黑客之间进行着从不间断的较量。那么作为普通的一个网站如何能用最简单的方法去防止自己的网页被篡改呢?或者至少在当自己的网页被篡改后能以最快的速度得知呢?在本文中,将介绍使用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>

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How do you set the session cookie parameters in PHP?How do you set the session cookie parameters in PHP?Apr 22, 2025 pm 05:33 PM

Setting session cookie parameters in PHP can be achieved through the session_set_cookie_params() function. 1) Use this function to set parameters, such as expiration time, path, domain name, security flag, etc.; 2) Call session_start() to make the parameters take effect; 3) Dynamically adjust parameters according to needs, such as user login status; 4) Pay attention to setting secure and httponly flags to improve security.

What is the main purpose of using sessions in PHP?What is the main purpose of using sessions in PHP?Apr 22, 2025 pm 05:25 PM

The main purpose of using sessions in PHP is to maintain the status of the user between different pages. 1) The session is started through the session_start() function, creating a unique session ID and storing it in the user cookie. 2) Session data is saved on the server, allowing data to be passed between different requests, such as login status and shopping cart content.

How can you share sessions across subdomains?How can you share sessions across subdomains?Apr 22, 2025 pm 05:21 PM

How to share a session between subdomains? Implemented by setting session cookies for common domain names. 1. Set the domain of the session cookie to .example.com on the server side. 2. Choose the appropriate session storage method, such as memory, database or distributed cache. 3. Pass the session ID through cookies, and the server retrieves and updates the session data based on the ID.

How does using HTTPS affect session security?How does using HTTPS affect session security?Apr 22, 2025 pm 05:13 PM

HTTPS significantly improves the security of sessions by encrypting data transmission, preventing man-in-the-middle attacks and providing authentication. 1) Encrypted data transmission: HTTPS uses SSL/TLS protocol to encrypt data to ensure that the data is not stolen or tampered during transmission. 2) Prevent man-in-the-middle attacks: Through the SSL/TLS handshake process, the client verifies the server certificate to ensure the connection legitimacy. 3) Provide authentication: HTTPS ensures that the connection is a legitimate server and protects data integrity and confidentiality.

The Continued Use of PHP: Reasons for Its EnduranceThe Continued Use of PHP: Reasons for Its EnduranceApr 19, 2025 am 12:23 AM

What’s still popular is the ease of use, flexibility and a strong ecosystem. 1) Ease of use and simple syntax make it the first choice for beginners. 2) Closely integrated with web development, excellent interaction with HTTP requests and database. 3) The huge ecosystem provides a wealth of tools and libraries. 4) Active community and open source nature adapts them to new needs and technology trends.

PHP and Python: Exploring Their Similarities and DifferencesPHP and Python: Exploring Their Similarities and DifferencesApr 19, 2025 am 12:21 AM

PHP and Python are both high-level programming languages ​​that are widely used in web development, data processing and automation tasks. 1.PHP is often used to build dynamic websites and content management systems, while Python is often used to build web frameworks and data science. 2.PHP uses echo to output content, Python uses print. 3. Both support object-oriented programming, but the syntax and keywords are different. 4. PHP supports weak type conversion, while Python is more stringent. 5. PHP performance optimization includes using OPcache and asynchronous programming, while Python uses cProfile and asynchronous programming.

PHP and Python: Different Paradigms ExplainedPHP and Python: Different Paradigms ExplainedApr 18, 2025 am 12:26 AM

PHP is mainly procedural programming, but also supports object-oriented programming (OOP); Python supports a variety of paradigms, including OOP, functional and procedural programming. PHP is suitable for web development, and Python is suitable for a variety of applications such as data analysis and machine learning.

PHP and Python: A Deep Dive into Their HistoryPHP and Python: A Deep Dive into Their HistoryApr 18, 2025 am 12:25 AM

PHP originated in 1994 and was developed by RasmusLerdorf. It was originally used to track website visitors and gradually evolved into a server-side scripting language and was widely used in web development. Python was developed by Guidovan Rossum in the late 1980s and was first released in 1991. It emphasizes code readability and simplicity, and is suitable for scientific computing, data analysis and other fields.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.