PHP:安全上传的简单而通用的方法:使用随机数进行XORing怎么样?

PHP:安全上传的简单而通用的方法:使用随机数进行XORing怎么样?,php,file,security,upload,Php,File,Security,Upload,我正在尝试实现一种简单、通用的方法,允许通过php脚本上传和下载文件,而不必担心服务器的安全性 关于这一点,有很多问题和答案,但从我所看到的来看,它们大多是几种方法的组合(检查文件扩展名、检查MIME类型、保存到受保护的目录、更改文件名等),每种方法都有其缺陷和/或漏洞 我在考虑一个php上传脚本,它为每个上传的文件创建一个随机的4字节数,然后对文件的内容进行XOR(根据需要重复4个字节),最后在保存之前将4个字节附加到文件中 对于下载,必须再次从文件中删除4个字节,内容将与它们异或,结果将发送

我正在尝试实现一种简单、通用的方法,允许通过php脚本上传和下载文件,而不必担心服务器的安全性

关于这一点,有很多问题和答案,但从我所看到的来看,它们大多是几种方法的组合(检查文件扩展名、检查MIME类型、保存到受保护的目录、更改文件名等),每种方法都有其缺陷和/或漏洞

我在考虑一个php上传脚本,它为每个上传的文件创建一个随机的4字节数,然后对文件的内容进行XOR(根据需要重复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);
            ?>

如果有人感兴趣,这是我现在使用的代码。它对我有用。到目前为止,我认为这是一个相当简单的解决方案。 如果有人对此有意见,我仍然感兴趣

上传:

            <?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);
            ?>