• User Attivo

    Script per cancellare file con caratteri speciali su Aruba

    Ciao a tutti, praticamente gestisco un sito con Hosting Linux su Aruba, in questo sito c'è un form tramite il quale si può fare l'Upload di file....a volte capita che questi file abbiamo dei caratteri speciali nel loro nome ( basta un apostrofo! ), quando succede questo sia che acceda tramite FTP sia che lo faccia dal pannello di controllo di Aruba, non posso ne rinominare ne scaricare e nemmeno cancellare quel file!!!
    Ho provato a fare una ricerca ed in effetti capita anche ad altri, alcuni hanno elaborato degli Script in PHP per cancellare i file in questione ( vedi ad esempio: w w w . guidepc . it/2010/12/aruba-pure-ftpd-caratteri-speciali/ ) però li ho provati tutti ma non funzionano....qualcuno sa come fare?
    Grazie mille dell'attenzione!


  • User Attivo

    Perché li vuoi cancellare? Se l'upload è gestito dal PHP, quest'ultimo ti consente di rinominarlo. La funzione che copia il file definitivamente sul webserver è la move_uploaded_file(). Il suo secondo parametro, come puoi vedere dalla documentazione, è il percorso completo che vuoi dare al file e quindi anche il suo nome. Prendi questa funzione:

    [php]
    function rimuovi_caratteri_speciali($stringa) {
    return preg_replace('/^\w+$/', '', $stringa);
    }
    [/php]

    ed applicala alla variabile che trovi come secondo parametro della funzione move_uploaded_file().
    Per quanto riguarda i files che hai già caricato, metti in un file php il seguente script che ti posto, ed in base ai commenti che ti ci metto decidi se rinominarli togliendo i caratteri speciali oppure se cancellarli.

    [php]
    <?php
    function contiene_caratteri_speciali($stringa) {
    return preg_match('/^\w+$/', $stringa);
    }
    function rimuovi_caratteri_speciali($stringa) {
    return preg_replace('/^\w+$/', '', $stringa);
    }
    $percorso = "/home/htdocs/dominio.it/home/"; // specifica qui il percorso della cartella che contiene i files
    $operazione = "c"; // c sta per cancella e r sta per rinomina
    if (!is_dir($percorso)) {
    echo "Non è una cartella";
    exit();
    }
    $dir = opendir($percorso);
    if (!$dir) {
    echo "Non posso accedere alla cartella, controlla i permessi";
    exit();
    }
    while (($file = readdir($dir)) !== FALSE) {
    if (!is_dir($file) && $file != ".." && $file != ".") {
    if (contiene_caratteri_speciali($file)) {
    if ($operazione == "c") {
    unlink($percorso . $file);
    echo "$file cancellato.<br>";
    }
    if ($operazione == "r") {
    $nuovonome = rimuovi_caratteri_speciali($file);
    rename($percorso . $file, $percorso . $nuovonome);
    echo "$file rinominato in $nuovonome<br>";
    }
    }
    }
    }
    closedir($dir);
    ?>
    [/php]

    AVVERTIMENTO: non l'ho testato. La regex che ho messo in preg_match e preg_replace è quella che include tutti i caratteri speciali tranne il punto e l'underscore. ***Fai prima un backup dei file contenuti in quella cartella, prima di far passare questo script.

    ***EDIT: il secondo parametro della preg_replace serve a specificare un carattere da sostituire al carattere speciale trovato. Non ci ho messo nulla, ma se ci vuoi un underscore, mettilo tra gli apici...


  • User Attivo

    Ciao Francesco, grazie mille della risposta...anche con questo codice quando richiamo il file.php da browser mi da sempre lo stesso errore:
    [h=1]Internal Server ErrorThe server encountered an internal error or misconfiguration and was unable to complete your request.
    Please contact the server administrator at postmaster comproorologi.org to inform them of the time this error occurred, and the actions you performed just before this error.
    More information about this error may be available in the server error log.

    Non so se magari sbaglio a mettere il percorso della cartella....i file in questione sono della cartella principale del mio sito ( w w w . comproorologi.org )...io nel tuo codice ho semplicemente sostituito 'dominio.it' con 'comproorologi.org'....


  • User Attivo

    @franz1386 said:

    io nel tuo codice ho semplicemente sostituito 'dominio.it' con 'comproorologi.org'....

    No, la variabile $percorso io l'ho assegnata per farti capire cosa ci dovevi mettere, ma dovevi personalizzarla tu. Sicuramente il tuo path non sarà quello che io ho stabilito... se sei su un Aruba Hosting Linux, il percorso della root è: /web/htdocs/w w w . comproorologi.org/home/ . Prova a utilizzare questo percorso. Ovviamente togli gli spazi tra le tre w, il Forum non mi ha dato possibilità di postare il percorso correttamente.


  • User Attivo

    Infatti poi me ne ero accordo e avevo già provato anche con quel percorso...non funziona lo stesso!
    Magari potrebbe essere utile farti vedere com'è il codice del file.php che gestisce l'upload dei file:
    <?php
    $marca=$_POST['marca'];
    $cassa=$_POST['cassa'];
    $movimento=$_POST['movimento'];
    $descrizione=$_POST['commento'];
    $email=$_POST['email'];
    //Get the uploaded file information
    $name_of_uploaded_file =
    basename($_FILES['uploaded_file']['name']);

    function rimuovi_caratteri_speciali($name_of_uploaded_file) {
    return preg_replace('/^\w+$/', '_', $name_of_uploaded_file);
    }

    //get the file extension of the file
    $type_of_uploaded_file =
    substr($name_of_uploaded_file,
    strrpos($name_of_uploaded_file, '.') + 1);

    $size_of_uploaded_file =
    $_FILES["uploaded_file"]/1024;//size in KBs

    //Settings
    

    $max_allowed_file_size = 9100; // size in KB
    $allowed_extensions = array("jpg", "jpeg", "gif", "bmp");

    //Validations
    if($size_of_uploaded_file > $max_allowed_file_size )
    {
    $errors .= "\n Size of file should be less than $max_allowed_file_size";
    }

    //------ Validate the file extension -----
    $allowed_ext = false;
    for($i=0; $i<sizeof($allowed_extensions); $i++)
    {
    if(strcasecmp($allowed_extensions*,$type_of_uploaded_file) == 0)
    {
    $allowed_ext = true;
    }
    }

    if(!$allowed_ext)
    {
    $errors .= "\n The uploaded file is not supported file type. ".
    " Only the following file types are supported: ".implode(',',$allowed_extensions);
    }
    //copy the temp. uploaded file to uploads folder
    $path_of_uploaded_file = $upload_folder . $name_of_uploaded_file;
    $tmp_path = $_FILES["uploaded_file"]["tmp_name"];

    if(is_uploaded_file($tmp_path))
    {
    if(!copy($tmp_path,$path_of_uploaded_file))
    {
    $errors .= '\n error while copying the uploaded file';
    }
    }

    $to = "[email protected]";
    // IL SOGGETTO DELLA MAIL
    $subject = "Offerta orologio";

    // COSTRUZIONE DEL CORPO DEL MESSAGGIO
    $body = "Contenuto del modulo:\n\n";

    $body .= "Marca: " . trim(stripslashes($_POST["marca"])) . "\n";
    $body .= "Cassa: " . trim(stripslashes($_POST["cassa"])) . "\n";
    $body .= "Movimento: " . trim(stripslashes($_POST["movimento"])) . "\n";
    $body .= "Descrizione: " . trim(stripslashes($_POST["commento"])) . "\n";
    $body .= "email: " . trim(stripslashes($_POST["email"])) . "\n";
    $body .= "File: " . trim(stripslashes($_FILES['uploaded_file']['name'])) . "\n";

    if(@mail($to, $subject, $body)) { // SE L?INOLTRO E? ANDATO A BUON FINE?

    echo "L'invio ? andato a buon fine, premi indietro per tornare alla pagina precedente!";

    } else {// ALTRIMENTI?

    echo "Si sono verificati dei problemi nell?invio della mail.";
    }

    ?>


  • User Attivo

    PS
    Ci ho aggiunto la funzione che mi avevi detto tu e quella funziona alla grande! 😃 grazie...


  • User Attivo

    @franz1386 said:

    PS
    Ci ho aggiunto la funzione che mi avevi detto tu e quella funziona alla grande! 😃 grazie...

    Figurati, anche se non ho capito come hai fatto a testarla visto che in quel codice non l'hai usata... ti posto l'algoritmo che hai postato "corretto" secondo le tue esigenze.

    [php]
    <?php
    function rimuovi_caratteri_speciali($name_of_uploaded_file) {
    return preg_replace('/^\w+$/', '_', $name_of_uploaded_file);
    }
    $marca = $_POST['marca'];
    $cassa = $_POST['cassa'];
    $movimento = $_POST['movimento'];
    $descrizione = $_POST['commento'];
    $email = $_POST['email'];

    //Get the uploaded file information
    $name_of_uploaded_file = rimuovi_caratteri_speciali(basename($_FILES['uploaded_file']['name']));

    //get the file extension of the file
    $type_of_uploaded_file = substr($name_of_uploaded_file, strrpos($name_of_uploaded_file, '.') + 1);

    $size_of_uploaded_file = $_FILES["uploaded_file"] / 1024; //size in KBs

    //Settings
    $max_allowed_file_size = 9100; // size in KB
    $allowed_extensions = array("jpg", "jpeg", "gif", "bmp");
    //Validations
    if ($size_of_uploaded_file > $max_allowed_file_size) {
    $errors .="\n Size of file should be less than $max_allowed_file_size";
    }
    //------ Validate the file extension -----
    $allowed_ext = false;
    for ($i = 0; $i < sizeof($allowed_extensions); $i++) {
    if (strcasecmp($allowed_extensions*, $type_of_uploaded_file) == 0) {
    $allowed_ext = true;
    }
    }
    if (!$allowed_ext) {
    $errors .="\n The uploaded file is not supported file type. " . " Only the following file types are supported: " . implode(',', $allowed_extensions);
    }

    //copy the temp. uploaded file to uploads folder
    $path_of_uploaded_file = $upload_folder . $name_of_uploaded_file;
    $tmp_path = $_FILES["uploaded_file"]["tmp_name"];
    if (is_uploaded_file($tmp_path)) {
    if (!move_uploaded_file($tmp_path, $path_of_uploaded_file)) {
    $errors .='\n error while copying the uploaded file';
    }
    }
    $to = "[email protected]";

    // IL SOGGETTO DELLA MAIL
    $subject = "Offerta orologio";

    // COSTRUZIONE DEL CORPO DEL MESSAGGIO
    $body = "Contenuto del modulo:\n\n";
    $body .="Marca: " . trim(stripslashes($_POST["marca"])) . "\n";
    $body .="Cassa: " . trim(stripslashes($_POST["cassa"])) . "\n";
    $body .="Movimento: " . trim(stripslashes($_POST["movimento"])) . "\n";
    $body .="Descrizione: " . trim(stripslashes($_POST["commento"])) . "\n";
    $body .="email: " . trim(stripslashes($_POST["email"])) . "\n";
    $body .="File: " . trim(stripslashes($_FILES['uploaded_file']['name'])) . "\n";
    if (@mail($to, $subject, $body)) {// SE L?INOLTRO E? ANDATO A BUON FINE?
    echo"L'invio ? andato a buon fine, premi indietro per tornare alla pagina precedente!";
    } else {// ALTRIMENTI?
    echo"Si sono verificati dei problemi nell?invio della mail.";
    }
    ?>
    [/php]

    EDIT: il mio script non funziona? Ti dà sempre Errore 500 - Internal Server Error o un altro errore?


  • User Attivo

    Ah...io l'avevo incollata lì in mezzo al codice, poi ho provato a inviare un file dal modulo e aveva funzionato...ora comunque ho usato il tuo che è sicuramente meglio! grazie...
    Comunque mi dà sempre Errore 500....


  • User Attivo

    Hai incluso anche lo slash finale nel percorso che ti ho dato per il tuo dominio (/web/htdocs/w w w . comproorologi.org/home**/**)?
    Se si, hai possibilità nel pannello di Aruba di guardare il log degli errori del webserver per vedere la descrizione dell'errore 500?

    EDIT: nel caso, prova a spostare i file in una sottocartella /files/, modifica il percorso in /web/htdocs/w w w . comproorologi.org/hom./files/, e a dare alla cartella files almeno i permessi 775.


  • User Attivo

    Sì, ce l'ho messo lo slash... gli errori che mi da sono questi:
    [TABLE="class: questionTab, width: 95%"]

    [TD][Thu Mar 14 15:20:15 2013] [error] [client 2.225.24.53:55078] - w w w . comproorologi . org - End of script output before headers: cancella.php[/TD]
    [/TR]

    [TD][Thu Mar 14 15:20:15 2013] [error] [client 2.225.24.53:55078] - w w w . comproorologi . org - AH01215: suexec policy violation: see suexec log for more details[/TD]
    [/TR]

    [TD][Thu Mar 14 15:07:52 2013] [error] [client 2.225.24.53:54340] - w w w . comproorologi.org - script not found or unable to stat: /web/htdocs/w w w . comproorologi.org/home/cancella.php

    E cmq non me li fa nemmeno spostare in una cartella...non ci posso proprio far niente con quei file, qualsiasi cosa faccio mi dice che non posso![/TD]
    [/TR]
    [/TABLE]


  • User Attivo

    Quindi Aruba utilizza suExec per la gestione dei permessi. Questa mi mancava. Mi puoi dire quali permessi sono impostati su quei files?


  • User Attivo

    Fai te che io non so nemmeno cosa sia suExec....comunque i permessi su quei file ( che non mi fa modificare!!! ) sono 644...


  • User Attivo

    @franz1386 said:

    Fai te che io non so nemmeno cosa sia suExec....comunque i permessi su quei file ( che non mi fa modificare!!! ) sono 644...

    Non te li fa modificare? E l'errore restituito sarebbe? Vai nel pannello di Aruba, vedi che c'è un tasto per ripristinare i permessi di files e cartelle, cliccalo, fagli ripristinare i permessi e verifica se quei 644 si modificano in qualcosa d'altro.


  • User Attivo

    Mi restituiva sempre lo stesso errore qualsiasi cosa faccia: 553 Prohibited file name: 1526'r+r$.jpg
    Però la cosa dei permessi ha funzionato e adesso i permessi sono 755...ho riprovato a richiamare il file.php con il tuo codice e adesso non mi da più l'errore...però mi restituisce una pagina bianca ed i file non si cancellano...


  • User Attivo

    Probabile io abbia sbagliato la regex... preg_match non restituisce un booleano, mi sono sbagliato. Prova a sostituire l'algoritmo con il seguente. Ho cambiato anche la funzione di rinominazione e cancellazione, se non riesce a cancellare ora ti dà un messaggio.

    [php]
    <?php
    function contiene_caratteri_speciali($stringa) {
    if (preg_match('/['^£$%&()}{@#~?><>,|=_+¬-]/', $stringa)) return true;
    else return false;
    }
    function rimuovi_caratteri_speciali($stringa) {
    return preg_replace('/['^£$%&
    ()}{@#~?><>,|=_+¬-]/', '', $stringa);
    }
    $percorso = "/web/htdocs/w w w .comproorologi.org/home/"; // specifica qui il percorso della cartella che contiene i files
    $operazione = "c"; // c sta per cancella e r sta per rinomina
    if (!is_dir($percorso)) {
    echo "Non è una cartella";
    exit();
    }
    $dir = opendir($percorso);
    if (!$dir) {
    echo "Non posso accedere alla cartella, controlla i permessi";
    exit();
    }
    while (($file = readdir($dir)) !== FALSE) {
    if (!is_dir($file) && $file != ".." && $file != ".") {
    if (contiene_caratteri_speciali($file)) {
    if ($operazione == "c") {
    if (!unlink($percorso . $file)) echo "Impossibile cancellare il file $file<br>";
    else echo "$file cancellato.<br>";
    }
    if ($operazione == "r") {
    $nuovonome = rimuovi_caratteri_speciali($file);
    if (!rename($percorso . $file, $percorso . $nuovonome)) echo "Impossibile rinominare il file $file<br>";
    else echo "$file rinominato in $nuovonome<br>";
    }
    }
    }
    }
    closedir($dir);
    ?>
    [/php]


  • User Attivo

    Adesso ha funzionato!!!! sei un grande....non capisco perchè non mi funziona in un altro sito che ho ma in quello ha funzionato!!! grazie mille...