让我们考虑一下这段代码:
if (md5_file(__FILE__) != 'MD5 CODE')
{
echo 'fail!';
}
当然,如果有条件的话,它总是会失败。或者有解决方案吗?
答案 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 -c
或sha1sum -c
。
此外,如果您担心服务器上的文件会以不受控制的方式进行修改,那么您可能会遇到更大的问题。如果这是因为可以自由修改服务器上的文件,则可能需要重新评估该策略。