2011-08-11 131 views
1

我正在使用以下脚本。它基本上检查被上传文件的名称是否已经存在,如果它应该将其重命名为其他内容并上传它。到目前为止,它不起作用。要么重命名所有文件,要么当我尝试通过网页打开文件说它损坏的文件。如果名称已经存在,如何重命名文件?

代码:

$sql="SELECT filename FROM doc_u WHERE person_id= '$pid'"; 

    $result=mysql_query($sql); 

    $query = mysql_query($sql) or die ("Error: ".mysql_error()); 

if ($result == "") 
{ 
echo ""; 
    } 
    echo ""; 


    $rows = mysql_num_rows($result); 

    if($rows == 0) 
    { 
    print(""); 

    } 
    elseif($rows > 0) 
    { 
    while($row = mysql_fetch_array($query)) 
    { 

    $existing = $row['filename']; 

    print(""); 
    } 

    } 

    if ($filename === $existing) { 
$filename = $uniqueidgenerator.strrchr($_FILES['filename']['name'], "."); 

    } else { 
    $filename = $_FILES['filename']['name'];; 
    } 

//After checking it will move the files

 if(move_uploaded_file($_FILES['filename']['tmp_name'],$upload_path . $filename)) 
    echo ''; 
    else 
    echo ''; 

回答

2

您使用的是数据库中已经考虑到,让我说asplainly地:切勿使用用户提供的文件名。相反,通过相应的数据库记录的主键ID号存储每个上传的文件(您正在使用自动递增整数的ids,对吗?)。将文件的名称存储在数据库中,现在您可以拥有任意数量的“text.txt”文件,因为每个实际的文件都将被命名为“1”,“53”和“207”等...

+1

这是如此重要。如果你让别人上传somejpeg.php到你的服务器,它可以验证为JPEG格式,但它本身仍然有恶意代码。有人可以使用这种方法基本上接管你的服务器。 – dqhendricks

+0

好,所以你要说取文件名并存储在数据库中,然后重命名正在上传的文件。当你把它提供给用户时,它将拥有我们给它的唯一文件名。但并不是那么糟糕,用户无法通过他们上传的名称获取文件... – KPO

+1

当然,您只需通过PHP提供文件并输出'header('Content-disposition:attachment; filename = ORIGINAL_FILENAME_HERE') ;'并且用户永远不会在服务器上看到它真的被称为'207'。 –

1

这里没有太多的代码可以继续。我怀疑$filename未正确初始化。所以在你的if ($filename === $existing)这真的说if(undefined === undefined)这将永远是真实的。

我不明白为什么这些文件会被破坏。这可能完全是一个不同的问题。

另外,请注意您的sql语句。这是一个等待发生的SQL注入。如果您使用了准备好的语句或至少使用mysql_escape_string,那将会好很多。当然,这已被弃用,以支持准备好的陈述。

更好的工作流程是先在数据库中插入一行文件的元数据,然后使用返回的主键重命名该文件。它总是保证独一无二。

相关问题