Domanda

Ciao a tutti, sto sviluppando un sito Web di condivisione di foto utilizzando il Framework PHP CodeIgniter . L'idea è che le persone possano caricare le loro foto, gestirle (attraverso una sorta di browser di file che consente loro di creare sottocartelle, trascinare i file in giro, ecc.) E modificarle (alcune cose di base come ridimensionamento, rotazione e ritaglio per iniziare, e più avanti, aggiungerò alcune funzionalità avanzate).

Ho già implementato una soluzione di autenticazione di terze parti per CI ( Redux Authentication 2 Beta ) e ora sto integrando un file manager JS / PHP ( AjaxExplorer ), ma il problema è che il backend di PHP per la gestione dei file (spostamento, copia, ecc.) si fida troppo dell'input dell'utente dalle chiamate ajax. Ad esempio, sta facendo cose del genere (semplificate per motivi di chiarezza):

move_uploaded_file(

Ciao a tutti, sto sviluppando un sito Web di condivisione di foto utilizzando il Framework PHP CodeIgniter . L'idea è che le persone possano caricare le loro foto, gestirle (attraverso una sorta di browser di file che consente loro di creare sottocartelle, trascinare i file in giro, ecc.) E modificarle (alcune cose di base come ridimensionamento, rotazione e ritaglio per iniziare, e più avanti, aggiungerò alcune funzionalità avanzate).

Ho già implementato una soluzione di autenticazione di terze parti per CI ( Redux Authentication 2 Beta ) e ora sto integrando un file manager JS / PHP ( AjaxExplorer ), ma il problema è che il backend di PHP per la gestione dei file (spostamento, copia, ecc.) si fida troppo dell'input dell'utente dalle chiamate ajax. Ad esempio, sta facendo cose del genere (semplificate per motivi di chiarezza):

<*>

Come puoi vedere, ci sono ovvi problemi di sicurezza in quanto accetta ciecamente qualsiasi percorso intrapreso dall'utente! Vedo già qualcuno che invia qualcosa come " ../ AnotherUser / " come valore $ _POST ['destination_dir'].

La mia domanda è: Qual è il modo migliore per " sandbox " un utente, al fine di consentirgli solo di gestire i propri dati? Devo solo convalidare + filtrare gli input, sperando di cogliere ogni tentativo di intrusione? Ci sono librerie / pacchetti dedicati per affrontare questo specifico problema?

Penso che questo problema debba essere risolto in qualche modo in qualsiasi progetto (abbastanza maturo), che offre ai suoi utenti il ??potere di gestire i propri file tramite un browser Web, quindi mi aspettavo di trovare alcune linee guida chiare al riguardo (poiché ce ne sono molti su SQL Injection, XSS, CSRF, ecc.) ma credo di non usare le parole chiave giuste.

FILES['upload']['tmp_name'], $root.$username.

Ciao a tutti, sto sviluppando un sito Web di condivisione di foto utilizzando il Framework PHP CodeIgniter . L'idea è che le persone possano caricare le loro foto, gestirle (attraverso una sorta di browser di file che consente loro di creare sottocartelle, trascinare i file in giro, ecc.) E modificarle (alcune cose di base come ridimensionamento, rotazione e ritaglio per iniziare, e più avanti, aggiungerò alcune funzionalità avanzate).

Ho già implementato una soluzione di autenticazione di terze parti per CI ( Redux Authentication 2 Beta ) e ora sto integrando un file manager JS / PHP ( AjaxExplorer ), ma il problema è che il backend di PHP per la gestione dei file (spostamento, copia, ecc.) si fida troppo dell'input dell'utente dalle chiamate ajax. Ad esempio, sta facendo cose del genere (semplificate per motivi di chiarezza):

<*>

Come puoi vedere, ci sono ovvi problemi di sicurezza in quanto accetta ciecamente qualsiasi percorso intrapreso dall'utente! Vedo già qualcuno che invia qualcosa come " ../ AnotherUser / " come valore $ _POST ['destination_dir'].

La mia domanda è: Qual è il modo migliore per " sandbox " un utente, al fine di consentirgli solo di gestire i propri dati? Devo solo convalidare + filtrare gli input, sperando di cogliere ogni tentativo di intrusione? Ci sono librerie / pacchetti dedicati per affrontare questo specifico problema?

Penso che questo problema debba essere risolto in qualche modo in qualsiasi progetto (abbastanza maturo), che offre ai suoi utenti il ??potere di gestire i propri file tramite un browser Web, quindi mi aspettavo di trovare alcune linee guida chiare al riguardo (poiché ce ne sono molti su SQL Injection, XSS, CSRF, ecc.) ma credo di non usare le parole chiave giuste.

POST['destination_dir']);

Come puoi vedere, ci sono ovvi problemi di sicurezza in quanto accetta ciecamente qualsiasi percorso intrapreso dall'utente! Vedo già qualcuno che invia qualcosa come " ../ AnotherUser / " come valore $ _POST ['destination_dir'].

La mia domanda è: Qual è il modo migliore per " sandbox " un utente, al fine di consentirgli solo di gestire i propri dati? Devo solo convalidare + filtrare gli input, sperando di cogliere ogni tentativo di intrusione? Ci sono librerie / pacchetti dedicati per affrontare questo specifico problema?

Penso che questo problema debba essere risolto in qualche modo in qualsiasi progetto (abbastanza maturo), che offre ai suoi utenti il ??potere di gestire i propri file tramite un browser Web, quindi mi aspettavo di trovare alcune linee guida chiare al riguardo (poiché ce ne sono molti su SQL Injection, XSS, CSRF, ecc.) ma credo di non usare le parole chiave giuste.

È stato utile?

Soluzione

  

Qual è il modo migliore per " sandbox " un utente, al fine di consentirgli solo di gestire i propri dati?

Consenti a tutti i nomi di file / directory desiderati dall'utente, ma semplicemente non utilizzali sul filesystem lato server. Invece, scrivi i nomi dei percorsi in un database con una chiave primaria e usa la chiave primaria come nome file come & # 8216; 34256.dat & # 8217; in una directory di archiviazione piatta (o anche come BLOB nel database, se si preferisce). Quindi servi tramite uno script di download o riscrivi l'URL per far apparire il nome del file desiderato nell'URL.

La disinfezione dei nomi dei file in arrivo è difficile . Rilevamento di & # 8216; .. & # 8217; è solo l'inizio. Nomi di file troppo lunghi; nomi di file troppo brevi; combinazioni di punti iniziali e finali; combinazioni di spazi bianchi iniziali e finali; i diversi separatori di directory di diverse piattaforme; caratteri non validi su alcune piattaforme; personaggi di controllo; Personaggi Unicode e modi specifici per l'ambiente di affrontarli; ADS; nomi di file (& # 8216; .htaccess & # 8217;) o estensioni (& # 8216; .php & # 8217 ;, & # 8216; .cgi & # 8217;) che potrebbero essere & # 8216; speciali & # 8217; al tuo server web; I nomi dei file riservati di Windows ...

Puoi passare tutta la vita a rintracciare strane stranezze delle regole del percorso dei file su varie piattaforme, oppure puoi semplicemente dimenticarlo e utilizzare il database.

Altri suggerimenti

Non sono sicuro di come sia il tuo destination_dir , ma quello a cui ho pensato è stato assegnare le chiavi delle directory e quindi ottenere la directory in base a quella chiave. Ad esempio:

//

Non sono sicuro di come sia il tuo destination_dir , ma quello a cui ho pensato è stato assegnare le chiavi delle directory e quindi ottenere la directory in base a quella chiave. Ad esempio:

<*>

Tuttavia, devi prima predefinire le chiavi. Un'altra alternativa potrebbe essere l'opposto: md5 / sha1 l'input e utilizzarlo come destinazione_dir, quindi archiviare quella chiave nel database con l'etichetta associata.

POST['destination_dir'] = '4hg43h5g453j45b3'; *_query('SELECT dir FROM destinations WHERE key = ? LIMIT 1'); //etc.

Tuttavia, devi prima predefinire le chiavi. Un'altra alternativa potrebbe essere l'opposto: md5 / sha1 l'input e utilizzarlo come destinazione_dir, quindi archiviare quella chiave nel database con l'etichetta associata.

Non ci sono librerie di cui sia a conoscenza.
Tuttavia, nel tuo esempio particolare, rimuovi tutte le barre (posteriori) e i punti dalla stringa e quindi aggiungi una barra alla fine, in questo modo l'utente non può cambiare cartella.

$destdir = str_replace(array('.', '/', '\\'), '', 

Non ci sono librerie di cui sia a conoscenza.
Tuttavia, nel tuo esempio particolare, rimuovi tutte le barre (posteriori) e i punti dalla stringa e quindi aggiungi una barra alla fine, in questo modo l'utente non può cambiare cartella.

<*>POST['destination_dir']); $destdir .= "/";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top