Я использую php-upload-script, который создает новый случайный 4-байтовый номер для каждого загруженного файла, затем XOR содержимое файла с этими 4 байтами (повторяя их так часто, как это необходимо), и, наконец, присоединяет 4 байта к файлу перед его сохранением.
Для загрузки 4 байта должны быть снова отрезаны от файла, содержимое снова будет XORed вместе с ними, и результат будет отправлен клиенту.
Таким образом, я могу быть уверен, что файлы, которые я сохраняю на сервере, не будут исполняемыми или имеют какое-либо потенциальное значение для любого приложения. Кроме того, мне не нужна дополнительная база данных для хранения имен файлов.
Вот код, который я использую для этого:
Загрузить:
<?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);
?>