我正在尝试实现一种简单的通用方法,以允许通过PHP-Script上传和下载,而不必担心服务器的安全性。
有很多问题和答案,但是据我所知,它们主要是几种方法的组合(检查文件扩展名,检查Mime-Type,保存到受保护的目录,更改文件名,等等(每个都有自己的缺陷和/或漏洞。
我正在考虑一个php-upload-script,为每个上传的文件创建一个随机的4字节数字,然后用它XORS XORS使用该文件(尽可能频繁地重复4个字节(,最后附加保存之前的4个字节。
要下载,必须再次将4个字节切下文件,其中内容将与它们一起固定,结果将发送给客户端。
这样,我可以确定我在服务器上保存的文件将无法执行或对任何应用程序具有任何潜在含义。另外,我不需要任何额外的数据库来存储文件名。
您如何看待这种解决方案在安全性和绩效方面?我有点关注服务器端的性能和所需的处理能力,但是XOR通常是快速而简单的。
这是我现在使用的代码,如果有人有兴趣。这个对我有用。到目前为止,它对我来说似乎是一个万无一失的解决方案。我仍然很感兴趣,如果有人对此有意见。
上传:
<?php
$outputfilename = $_POST['filename'];
$inputfile = $_FILES["myblob"]["tmp_name"];
$tempfilename="temp.tmp";
if( move_uploaded_file($inputfile, $tempfilename) ) {
$XORstring = random_bytes(4);
$tempfile=fopen($tempfilename, "r");
$outputfile=fopen($outputfilename, "w+");
flock($outputfilename, LOCK_EX);
fwrite($outputfilename, $XORbytes1);
while ( $buffer = fread($tempfile, 4) ) {
$buffer = $buffer ^ $XORstring;
fwrite($outputfilename, $buffer);
}
flock($outputfilename, LOCK_UN);
fclose($tempfile);
fclose($outputfile);
unlink($tempfilename);
}
exit(0);
?>
下载:
<?php
$inputfilename = $_POST['filename'];
$tempfilename = "temp.tmp";
$inputfile=fopen($inputfilename, "r");
$tempfile=fopen($tempfilename, "w+");
flock($tempfile, LOCK_EX);
$XORstring = fread($inputfile, 4);
while ( $buffer = fread($inputfile, 4) ) {
$buffer = $buffer ^ $XORstring;
fwrite($tempfile, $buffer);
}
flock($tempfile, LOCK_UN);
fclose($inputfile);
fclose($tempfile);
readfile($tempfile);
unlink($tempfile);
exit(0);
?>