move_uploaded_file();
ftp_put();
我有一个输入类型文件,让用户上传图片。
我尝试将用户的图像保存到不同的服务器或子域。
因此,如果有人将恶意文件上传到服务器,它将不会在我的主服务器上执行。
我的问题是
我该如何
move_uploaded_file
使用ftp_put
?我应该得到另一个服务器或子域就足够了吗?
move_uploaded_file();
ftp_put();
我有一个输入类型文件,让用户上传图片。
我尝试将用户的图像保存到不同的服务器或子域。
因此,如果有人将恶意文件上传到服务器,它将不会在我的主服务器上执行。
我的问题是
我该如何move_uploaded_file
使用ftp_put
?
我应该得到另一个服务器或子域就足够了吗?
使用不同的子域不会将其与您的服务器隔离:要做到这一点,您需要将其实际放在不同的机器上。但是,仅将文件保存到您的服务器并不会给您带来任何危险。当某些东西试图以不安全的方式与该文件交互时,就会出现问题。因此,例如,特定的图像查看程序可能存在恶意图像可以利用的缺陷。在这种情况下,使用此程序打开上传的图像会使您处于危险之中。
检查文件扩展名不是确定文件类型的合法方法。例如,我可以编写一个恶意可执行文件并将其命名为my_vacation_pic.jpeg
. 但是再一次,将它保存在文件系统上对您来说不是问题。
如果你想弄清楚文件类型,你需要类似 unixfile
命令的东西,尽管老实说我不确定用这个命令打开可能的恶意文件会涉及什么样的风险。
但是,file
不保证文件中没有恶意内容。例如,它可能会告诉您它是某个种类的可执行程序,但它不能告诉您它可以安全运行。或者它可以告诉您它是一个 JPEG 文件,但它不能告诉您如果在特定程序中打开它,有人还没有找到使其成为恶意文件的方法。确保文件没有恶意的最好方法是使用正版防病毒软件(当然,也不能保证)。
但实际上,对安全性的需求完全取决于您打算用它做什么。仅仅存储数据并不意味着它将以任何方式执行(除非您的操作系统、文件系统驱动程序或将文件放在那里的程序存在特定漏洞)。
文件上传只是将上传的内容放在您的文件系统上:然后您可以使用任何正常的方法将文件从一个系统移动到另一个系统。例如,是的,您可以使用ftp_put
将文件从本地文件系统传输到远程 FTP 服务器,就像处理任何其他文件一样。该变量$_FILES["upload_key"]["tmp_name"]
告诉您存储上传文件的文件系统路径,因此您应该能够直接将其传递给ftp_put
任何其他文件。
move_uploaded_file
并且ftp_put
用于不同的目的。
ftp_put
需要 FTP 资源连接。
一种方法是不使用 move_uploaded_file 来放置临时文件,而是将其直接发送到 ftp 服务器。
看到这个片段:
<?php
// ... some code here ...
$remote_filename = 'path/to/your/uploaded/files/' . $_FILES['imagefile']['name'];
ftp_put($ftp_stream, $remote_filename, $_FILES["imagefile"]["tmp_name"]);
作为一般规则,当您允许人们上传文件时,您会测试它是否是您想要的图像文件、JPEG、PNG 等文件类型,据我所知,这些文件不包含恶意软件,除非它是一些可怕的图片。
就像是
if($_FILES["imagefile"]["size"] >= 2120000) {
echo "F2";
die();
} else {
$imageData = @getimagesize($_FILES["imagefile"]["tmp_name"]);
if($imageData === FALSE || !($imageData[2] == IMAGETYPE_GIF || $imageData[2] == IMAGETYPE_JPEG || $imageData[2] == IMAGETYPE_PNG)) {
echo "F2";
die();
}
}
这不是完整的代码,而是测试图像类型和大小的示例。我不确定 ftp_put,但 file_upload 首先将其放在服务器上的 tmp 文件夹中,然后将其复制到您指定的位置。