包含()之前的PHP校验和

时间:2010-07-15 07:05:03

标签: php security include callback checksum

我一直致力于开发一个应用程序,允许构建第三方扩展来扩展应用程序的功能。所有这一切都在PHP中,当然。我想通过校验和功能在某个目录中运行文件来添加一些安全填充。如果文件未通过校验和,则文件未“包含”,将通知该安装的管理员,并且模块将被禁用,直到管理员执行操作(重新启用并记录异常,或重新安装模块)

我现在遇到的问题是,只要用户运行include()函数,就能运行该校验和。我宁愿不让他们背靠背运行两个函数只是为了包含一个文件,但如果我必须,我会。并非所有第三方扩展都非常愿意运行两个函数(类似if(checksum_function($bleh)) include($bleh);),即使它们是,但每当{{1}运行校验和时,它会更容易(也更安全)执行,而不是加倍include()语句的行数。

我做了一些搜索并没有找到太多。想法?提前谢谢!

4 个答案:

答案 0 :(得分:0)

如果您的包含是以特定系统命名的类(例如MyPlugin_Text),则可以使用PHP的autoloading。当首次创建类的对象时,自动加载可用于自动包含文件。

非常简化的例子:

function __autoload($class_name) {

  require_once $class_name . '.php';
}

$myTextPlugin = new MyPlugin_Text(); 

显然,您需要扩展自动加载器,例如仅对以MyPlugin_开头的类进行预加载,并从特定文件夹加载。

除了编写自定义包装函数外,我知道除了编写自定义包装函数之外别无他法。

我一般都喜欢你的想法。但是,计算校验和 - 例如使用crc32() - 相对昂贵。不应该有太多,而不是太大,包括加载这种方式。此外,如果攻击者能够修改系统上的PHP文件,他们也可以直接执行它们而无需中央应用程序。这项练习的实际安全性收益可能很小。

答案 1 :(得分:0)

考虑为include编写一个包装器:

function include_safe($library) {
    if(checksum_function($library))
        include($library);
}

您不会发现许多开发人员对使用此类功能感到“高兴”,但您也无法覆盖PHP语言结构(如includerequire)。拥有包装所有内容的功能既方便又快捷,因此开发人员可能会使用它。

答案 2 :(得分:0)

在许多移动代码平台中,通常会看到使用RSA Digital Signature签名的可执行代码。这允许权限“确定”一段代码然后可以分发给第三方并且客户知道代码是安全的。数字签名用于帮助防止现代控制台视频游戏的盗版。它们还用于验证软件更新来自供应商,而不是攻击者。

这个php应用程序可以拥有公钥(甚至可以使用此公钥分发)。管理员可以访问公钥和私钥,使用它可以签署.php文件。在包括时,可以检查签名。如果php文件被修改或损坏,签名将不会通过检查。

在实践中,PHP应用程序执行许多包含,因此任何验证功能都将是一个巨大的瓶颈。任何安全的东西也会非常昂贵。最好一次检查签名,然后将其传输到列入白名单的目录或数据库。另一种提高速度的方法是使用较小的RSA密钥进行签名。例如,512位RSA密钥对于SSLv3来说足够好,所以它可能足够好了。

MD5非常糟糕。如果您存储了“安全”md5文件哈希的白名单,那么这将打开collision generation的大门。这是使用md5前缀攻击的理想情况,因为在文件开头的特制二进制数据不会阻止include()执行php标记<?php ?>中的代码。

CRC甚至比md5 还差。 CRC不是为了使哈希冲突更加困难。 CRC仅用于检测随机噪声造成的损坏。通过将数据a附加到消息CRC collision can be generated

,对md5使用类似的攻击

sha1是一个安全快速的哈希函数,您可以使用它。有类似的哈希冲突攻击会影响sha1。然而,与md5不同,没有人生成sha1 collsion和NIST still considers its use to be safe。虽然sha256将是一个更安全的选择。

答案 3 :(得分:0)

我认为在每次加载时检查校验和是个坏主意,因为它肯定会减慢你的应用程序。

另一种方法是在应用程序管理界面中放置一些东西来安装或启用插件。

然后你可以在安装插件时检查一次插件并将其添加到已启用的插件列表中,然后才能使用它。

您还可以每天检查一次所有插件,以检查是否有人更改了......但是很难确保安全,因为在安装插件时更改插件也可能会改变您的安全功能。