Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    filtrare caratteri speciali nell'upload

    ciao a tutti!
    io per filtrare da "caratteri speciali" i nickname degli utenti che si registravano scrivevo:
    Codice PHP:
    if(!preg_match("/^[a-z0-9]+$/i"$singolo1)){

    die(
    "Non puoi usare caratteri speciali.");


    ma per filtrare l'upload di foto non va bene, probabilmente perchè c'è il punto più estensione.
    Come modifico l'espressione regolare per fare l'upload di immagini o di qualunque altra cosa?
    grazie

  2. #2
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Forse perchè non c'è nulla da filtrare, cioè

    $_FILES['campo']['name'] Il nome del file sul client dell'utente
    $_FILES['campo']['type'] Il tipo mime se il browser dell'utente fornisce l'informazione
    $_FILES['campo']['size'] La dimesione in bytes del file caricato
    $_FILES['campo']['tmp_name'] Il nome temporaneo del file in cui il file caricato è stato memorizzato sul server
    $_FILES['campo']['error'] Il codice d'errore associato al caricamento del file

    Quindi dopo un upload verifichi che error sia 0 o UPLOAD_ERR_OK altrimenti hai avuto un errore in fase di upload (Error Code) se non hai avuto errori in tmp_name hai il nome del file temporaneo che sposterai dove ti pare dandogli il nome che preferisci o conservando quello dall'utente con una move_uploaded_file.

    Esplicativo l'esempio sul manuale php
    Codice PHP:
    <?php
    $uploaddir 
    '/var/www/uploads/';
    $uploadfile $uploaddir basename($_FILES['userfile']['name']);

    echo 
    '<pre>';
    if (
    move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo 
    "File is valid, and was successfully uploaded.\n";
    } else {
        echo 
    "Possible file upload attack!\n";
    }

    echo 
    'Here is some more debugging info:';
    print_r($_FILES);

    print 
    "</pre>";

    ?>
    Assicurarsi invece che il contenuto del file sia quello atteso, è ben altro.
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    non capisco... mi fa caricar tutto!
    ma anche se scrivo:
    if($_FILES["upfile"]["error"]!=0){die("Carattere non consentito all'interno del nome del file");}
    mi fa caricar tutto!

  4. #4

  5. #5
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Specifica meglio il tipo di limitazione che vorresti avere nell'upload di un file
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    stavo pensando... secondo voi cos'è indispensabile filtrare? apice e monoapice? perchè senò basta un strpos o strstr e con un die dire di cambiare il nome o ci son altri caratteri?

  7. #7
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Il nome del file, così come presente sul client che cerca di fare il caricamento file su server, è presente nella variabile $_FILES['Nome_Del_Tuo_Campo_File']['name']. Sta di fatto che quel nome lo puoi pacificamente ignorare perchè, in prima istanza il file caricato lo trovi in un file il cui nome è depositato in $_FILES['Nome_Del_Tuo_Campo_File']['tmp_name'].

    La questione legata agli apici singoli non entra in gioco, perchè i filesystem consentono l'utilizzo di tali caratteri, a meno che non cerchi di memorizzare il nome del file in un database. In tali circostanze, l'utente malizioso, potrebbe tentare una SQL injection (spiegazione + esempio) che viene solitamente utilizzate per garantirsi l'accesso ad una sezione riservata. Ma di norma basta un bel addslash(), o meglio ancora una mysql_escape_string(), attualmente deprecata in favore della mysql_real_escape_string(), sui dati che vanno sottoposti al database in modo da rendere innoquo ogni apice sia pure malizioso.

    Il codicillo che hai postato non è concettualmente corretto
    Codice PHP:
    if($_FILES["upfile"]["error"]!=0)
        die(
    "Carattere non consentito all'interno del nome del file"); 
    Poichè l'errore non è generato da un carattere non consentito nel nome del file (nel senso che tu vuoi intendere), ma è legato all'esito dell'upload. A tal fine ti invito a prendere visione dei Codici di Errore che possono essere prodotti dall'attività di upload.
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  8. #8
    oltre ai problemi che ti ha citato grino ve ne sono anche altri:
    - sul pc l'utente può salvare i file utilizzando caratteri "brutti":
    questi ne sono alcuni che scopiazzai da qualche parte... non ricordo dove
    codice:
    $char_bad = array(
    							'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 
    							'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 
    							'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 
    							'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 
    							'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 
    							'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 
    							'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
    							'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 
    							'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 
    							'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 
    							'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 
    							'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 
    							'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 
    							'ÿ'=>'y', 'ƒ'=>'f');
    - sul pc dell'utente potrebbero esserci gli "spazi" e un URL con degli spazi non sono una bella cosa...

    a fronte delle problematiche esposte io ho faccio una funzione filtro del nome
    ad es.
    Codice PHP:
    $new_name preg_replace
                         array(
    "/\s+/""/[^-\.\w]+/"), 
                         array(
    "_"""), 
                         
    trim($_FILES['upload']['name'])); 
    oppure rinomino il file dandogli un nome sicuro al 100% stando attento a preservare l'estensione del file
    ad es.
    Codice PHP:
    function catch_estensione($file_name='')
        {
        
    $ext strtolower(end(explode('.'$file_name)));
        return 
    $ext;
        }
    $new_name time().catch_estensione($_FILES['upload']['name']); 

  9. #9
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Giusto!!!
    Recuperare l'estensione del file.
    Io userei
    Codice PHP:
    $ext=pathinfo($pathPATHINFO_EXTENSION); 
    ma ci sono molti modi per fare la stessa cosa.
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    grazie mille a tutti! ora è tutto chiaro!
    bell'idea dare il nome con time()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.