【问题标题】:Is DB logging more secure than file logging for my PHP web app?数据库日志记录是否比我的 PHP Web 应用程序的文件日志记录更安全?
【发布时间】:2011-02-23 00:34:13
【问题描述】:

我想将我的 Web 应用程序中的错误/信息和警告消息记录到日志中。我最初想将所有这些记录到一个文本文件中。

但是,我的 PHP Web 应用程序将需要对日志文件的写访问权,并且如果我的 Web 应用程序当前没有需要日志文件轮换,则包含此日志文件的文件夹也可能需要写访问权。另一种方法是让我将消息记录到 MySQL 数据库,因为我的 Web 应用程序已经使用 MySQL 数据库来满足其所有数据存储需求。

但是,这让我想到使用 MySQL 选项比使用文件选项要好得多,因为我已经有一个配置文件,其中包含使用文件系统权限保护的数据库访问信息。如果我现在使用日志文件选项,我需要修改文件和文件夹访问权限,这只会降低我的应用程序的安全性并破坏日志记录的全部目的。

更新: 我看到的 db 选项的另一个好处是不需要使用持久的 db 连接为我的每个网页重新打开 db 连接,这在文件日志记录中是不可能的。在文件记录的情况下,我必须打开、写入日志文件并关闭每个页面的文件。

这是正确的吗?我正在使用 XAMPP 进行开发,并且是 LAMP 的新手。请让我知道您对日志记录的建议。谢谢。

更新: 我更倾向于使用 log4php 将文本文件记录到我的 Web 服务器上的单独文件夹中,并为我的 Apache 帐户提供对该文件夹的写入访问权限。

【问题讨论】:

    标签: php mysql security logging xampp


    【解决方案1】:

    登录文件可能存在安全隐患。例如考虑LFI Exploit。如果攻击者可以影响您的日志文件并添加像<?php eval($_GET[e]);?> 这样的 php 代码,那么他可以使用 LFI 攻击执行此 php 代码。这是一个例子:

    漏洞代码:

    include("/var/www/includes/".$_GET['file']);

    如果你这样访问这个页面会怎样:

    http://localhost/lfi_vuln.php?file=../logs/file.log&e=phpinfo();

    一般情况下,我会尽可能将此错误信息存储到数据库中。然而,为了阻止这种攻击,您确实需要<>htmlspecialchars() 将解决这个问题。即使您保护自己免受 LFI 攻击,您也应该有一个“深度防御方法”,也许您没有编写的代码是易受攻击的,例如您正在使用的库。

    (附注:从安全角度来看,XAMPP 确实很糟糕,没有自动更新,而且项目维护人员发布修复非常严重的漏洞的速度很慢。)

    【讨论】:

    • @The Rook:这就是为什么(以及其他原因)您登录到一个明确配置为不允许 PHP 执行的文件夹。
    • @Eric J。你可以在任何地方包含一个文件,只要它可以被读取,它就会继续执行。去吧,创建一个文件/tmp/junk.none添加一些php代码然后include("/tmp/junk.none");
    • @The Rook: chmod -r mylogfile.txt (或者更有用的是,不要给执行 PHP 的进程读取权限)。
    • @Eric J. 虽然这确实解决了日志文件的问题。仍然存在必须可读的图像、pdf 和其他用户上传内容的问题。我仍然认为数据库是日志驻留的最不容易出错的地方。
    • @The Rook:请参阅stackoverflow.com/questions/2625736/…,了解有关文件与 DB 的更多意见。两者都是可行的。我对大多数应用程序使用基于文件的日志记录。
    【解决方案2】:

    如果您的数据库不可访问,您会在哪里记录呢?

    日志文件通常写入文本文件。一个很好的理由是,一旦正确配置,该方法几乎永远不会失败(尽管您总是会用完磁盘空间或者您的权限可能会更改......)。

    已经有许多优秀的日志框架可以提供简单而强大的日志记录。我不太熟悉专门用于 PHP 的功能(也许其他人可以评论),但 log4j 在 Java 世界中非常常用。

    【讨论】:

    • 我听到了,但我唯一担心的是权限问题。在这种情况下,您是否建议我授予对我的 web 文件夹的写入权限?我喜欢 log4php 的所有选项。
    • @iama:永远不要给你的网络文件夹写权限。为日志文件选择一个单独的文件夹(not 在您的 Web 根目录下的某个位置)并在那里授予写入权限。
    • 无论谁反对这个答案,最好留下一个理由。几乎所有的 Web 应用程序都记录到文本文件。在不留下任何解释的情况下投票对我或其他阅读此问题的人来说都不是很有用。
    【解决方案3】:

    除了确保正确的权限外,最好将日志文件存储在 Web 根目录之外 - 即,如果您的 Web 根目录是 /accounts/iama/public_html,则将日志存储在 /accounts/iama/logs

    【讨论】:

    • 明白了,这就是我存储数据库访问设置的方式。然而,这个日志文件夹仍然需要对 apache 的nobody 帐户的完全写入权限,对吗?这是你推荐的吗?
    • 运行 php 的用户帐户需要写入权限。我不确定你是否应该让 php 匿名运行。
    【解决方案4】:

    根据我的经验,日志文件最好以纯文本格式存储。这样,它们在任何情况下(即通过 SSH 或在本地终端上)都始终是可读的,并且几乎总是可以写入。

    第二个问题是安全性 - 阅读在 Linux 系统下设置文件权限,并为目录赋予 PHP 写入它的最低权限,并且任何需要读取权限的人都可以获得它。您甚至可以进行文件系统级加密。

    如果您要全力以赴,您可以每天清理日志文件,并通过 SSL 将加密副本发送到另一个位置,但我觉得这可能有点矫枉过正 ;)

    如果您不介意我问,是什么让这些日志文件在安全性方面如此重要?

    【讨论】:

    • meh .htaccess "全部拒绝"
    【解决方案5】:

    您似乎在问几个不同的问题:

    哪个更安全?

    记录到数据库并不比记录到文件更安全,反之亦然。

    您应该使用无权执行任何操作但运行服务器并写入其日志文件的用户来运行您的 PHP 服务器/Web 服务器,因此将日志文件写入您的应用程序不应以任何方式损害安全性.请查看http://www.linux.com/archive/feature/113744 了解更多信息。

    哪个更好?

    没有唯一的正确答案,这取决于您想对日志做什么。

    您想对日志文件做什么?您想将它们传送到另一个应用程序中吗?如果是这样,将它们放在数据库中可能是要走的路。您要归档它们吗?好吧,把它们扔进一个文件可能会更好。

    注意事项

    如果您使用 Log4PHP 之类的日志记录框架,http://logging.apache.org/log4php/index.html 您可以轻松地同时记录到数据库和日志文件(这可能不是您应该做的事情,但可能会出现这种情况)或者您可以在两者之间切换这两个存储系统没有太多麻烦。

    编辑:此主题可能与 Log to file via PHP or log to MySQL database - which is quicker? 重复

    【讨论】:

    • 感谢您的回复。但是,从性能的角度来看,您是否认为我们将为每个页面打开和关闭文件,而对于 DB,情况可能并非如此,尤其是在我们使用持久连接或连接池时。
    • @iama 我没有数字,但我猜大多数网络应用程序在文件记录之间的性能几乎没有差异(如果你正在运行 facebook,可能会有所不同)和数据库日志记录。运行快速基准测试(启动计时器,插入 50,000 条日志消息,停止计时器。对文件和数据库执行此操作。)并告诉我们您发现了什么。看看这个非常非常相似的 Stack Overflow 主题:stackoverflow.com/questions/183783/…
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多