PHP,自验证脚本(MD5),如何写一个?

时间:2015-04-05 18:35:41

标签: php md5

让我们考虑一下这段代码:

if (md5_file(__FILE__) != 'MD5 CODE')
{
    echo 'fail!';
}

当然,如果有条件的话,它总是会失败。或者有解决方案吗?

2 个答案:

答案 0 :(得分:3)

您永远无法正确执行该代码,因为每当您更新MD5_CODE时,文件的哈希值都会发生变化。

检查文件的唯一方法是从另一个文件,但不是从自身。除非你把哈希放在外部文件中:

$hash = file_get_contents('myhash.txt');

if (md5_file(__FILE__) != $hash) {
    print "WARNING: Code modified!";
}

答案 1 :(得分:2)

有很多方法可以自我验证'使用哈希函数。其中一个技巧是将预期的md5哈希存储在php脚本的第一行,然后在该行之后验证该文件。

<?php
$md5Expected="md5string"; $sizeExpected=<bytes>;
<Code to validate.  Includes last line.>
?>

检查此功能可能看起来有点像:

function validateMeContents( $md5Expected, $sizeExpected ) {
        $checkFilename = basename( $_SERVER['PHP_SELF'] );
        // the first 2 lines are not checked
        $fileContents = array_splice( file( $checkFilename ), 2 );
        $md5Contents = md5( implode( $fileContents ) );
        $mySize = filesize( $checkFilename );

        return( ( $md5Expected == $md5Contents ) and ( $sizeExpected == $mySize ) );
}

请注意,您可能需要检查文件的大小,这会考虑前两行代码。

有人提出了有效的观点,即验证最好由外部第三方(如操作系统)完成。查看md5sum -csha1sum -c

此外,如果您担心服务器上的文件会以不受控制的方式进行修改,那么您可能会遇到更大的问题。如果这是因为可以自由修改服务器上的文件,则可能需要重新评估该策略。