5

出于安全原因,我希望能够监控对我的 Web 服务器上的某个文件的访问。每次访问它时,我都希望在 MySQL 日志表中添加一个条目。这样,我可以从 Web 应用程序中主动响应安全漏洞。

4

3 回答 3

1

Apache HTTP 服务器提供日志记录功能。

服务器访问日志记录了服务器处理的所有请求。访问日志的位置和内容由CustomLog指令控制。LogFormat指令可用于简化日志内容的选择。本节介绍如何配置服务器在访问日志中记录信息。

它可用于将日志写入文件。如果需要存储在 MySQL 表中,请运行 cron 作业将文件导入数据库。

关于日志的更多信息在这里: http ://httpd.apache.org/docs/1.3/logs.html#accesslog

于 2013-06-17T07:17:45.920 回答
1

它已从 PHP7 中删除,但对于发现这篇文章的其他人来说,FAM(现在的 PECL)扩展中有许多选项。这个函数http://php.net/manual/en/function.fam-monitor-file.php似乎描述了这里需要什么

此外,您可以通过http://php.net/manual/en/function.stat.php访问有关文件状态的大量详细信息。把它放在一个 cron 或 sleep 驱动的脚本中,然后你就可以看到它什么时候改变了。

于 2016-09-21T07:12:58.023 回答
0

可以从三个点访问该文件:

  1. 直接文件系统访问
  2. 像这样调用 url www.example.com/importantfile.jpg(apache 提供文件)
  3. 调用服务器www.example.com/readfile.php?name=important.jpg上读取文件的一些 php 脚本。

如果您只关心案例 2,请查看 Rishi Dua 的解决方案。

但是,如果您想要更多,那么您应该编写一个带有fileatime()调用的脚本,然后将其添加到 cron 以例如每分钟运行一次。

它的伪代码:

<?php
$previous_access_time = get_previous_access_time(); // get the previous last access time from you remembered in db or textfile or whatever
$current_access_time = fileatime('path/to/very_important_file.jpg');
if ($previous_access_time != $current_access_time) {
   log_access_to_db();
   save_new_access_time(); // update the new last access time
}

然而,该解决方案存在一些问题。首先是您只能获取访问时间,但不能获取访问文件的用户 ID 或 IP。其次,正如手册所说,某些Unix系统不会更新访问时间,因此解决方案会失败。

如果您非常关心安全性,那么我认为您必须检查一些像这样的审计工具

于 2013-06-17T07:41:30.513 回答