Sto costruendo un'applicazione PHP che consente l'upload di file (.doc / pdf etc) per la revisione da parte di un membro dello staff. Alcuni di questi file saranno alquanto confidenziali, quindi ho bisogno di proteggerli.
Ora la soluzione migliore sarebbe ottenere che il mittente crittografi questi file con GPG o simili prima di caricarli e decrittografarli con una chiave precondivisa all'altra estremità (sul computer dello staff, non sul server Web).
Tuttavia non è realistico aspettarsi che tutti i clienti installino e imparino a utilizzare GPG per caricare i file.
Quindi la soluzione migliore che riesco a trovare è:
1) Carica i file su HTTPS su una pagina protetta da password.
2) Cifra i file utilizzando GPG asimmetrico e un file di chiavi pubblico memorizzato sul server web.
3) Elimina tutte le copie non crittografate del file in / tmp, ecc.
4) Invia un'email per il personale che notifica loro che il file è disponibile per il download.
5) Il membro dello staff accede e scarica il file, quindi elimina la copia crittografata.
6) Il membro dello staff quindi decrittografa il file utilizzando la sua chiave privata che non è archiviata sul server web.
L'idea è che se il server web viene compromesso (è un server dedicato, quindi non condiviso con altri), l'autore dell'attacco non sarà in grado di decodificare questi file perché non troveranno la chiave lì.
Tuttavia: penso che sia ancora vulnerabile.
Perché, se un utente malintenzionato ha root o anche solo il controllo dell'utente del server HTTP, sarà in grado di leggere i dati da / tmp mentre il file viene ancora caricato / crittografato e creare una copia non crittografata che può scaricare in seguito.
Quindi potrei fare tutto questo in memoria senza scrivere in / tmp? Ma c'è ancora il rischio che l'attaccante possa scoprire gli indirizzi di memoria a cui sono scritti i dati caricando un file da soli e quindi utilizzare ptrace per ispezionare e copiare quegli indirizzi di memoria.
Non riesco a pensare a un modo per risolvere questo problema poiché avrò bisogno dei dati in testo in chiaro per fare la crittografia. C'è un modo in PHP per rendere più difficile l'ispezione della memoria? Oppure esiste un servizio web di terze parti che sarebbe meglio usare per questo?