让我们考虑一下这段代码:
if (md5_file(__FILE__) != 'MD5 CODE')
{
echo 'fail!';
}当然,在有条件的情况下,无论写什么,它都会失败。或者有解决方案吗?
发布于 2015-04-06 02:46:45
您将永远无法正确执行该代码,因为每当您更新MD5_CODE时,文件的哈希都会更改。
检查文件的唯一方法是从另一个文件检查,而不是从文件本身检查。除非您将散列放在外部文件中:
$hash = file_get_contents('myhash.txt');
if (md5_file(__FILE__) != $hash) {
print "WARNING: Code modified!";
}发布于 2017-09-02 08:29:28
有一些方法可以使用散列函数进行“自我验证”。其中一个技巧是将预期的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 ) );
}请注意,您可能希望检查文件的大小,这将考虑到代码的前2行。
已经提出了有效的观点,即验证可能最好由外部第三方完成,例如操作系统。查看md5sum -c或sha1sum -c。
此外,如果您担心服务器上的文件会以不受控制的方式进行修改,那么您可能会遇到更大的问题。如果这是因为可以自由修改服务器上的文件,则可能需要重新评估该策略。
https://stackoverflow.com/questions/29460803
复制相似问题