Per evitare errori nel download dei file con PHP occorre procedere per step.
Ipotizziamo di voler consentire il download di file PDF. Avremo:
if( isset( $_GET['pdf'] ) ) {
$pdf_base_url = 'https://sito.com/uploads/pdf/';
$pdf_base_path = $_SERVER['DOCUMENT_ROOT'] . '/uploads/pdf/';
$pdf = trim( $_GET['pdf'] );
$pdf_full_url = $pdf_base_url . $pdf;
$pdf_full_path = $pdf_base_path . $pdf;
if( preg_match( '/\.pdf$/', $pdf ) ) { // 1
if( file_exists( $pdf_full_path ) ) { // 2
$finfo = finfo_open( FILEINFO_MIME_TYPE ); // 3
$mimetype = finfo_file( $finfo, $pdf_full_path );
finfo_close( $finfo );
if( $mimetype == 'application/pdf' ) {
header( 'Content-type: application/pdf' );
header( 'Content-Disposition: attachment; filename="' . $pdf . '"' );
readfile( $pdf_full_url );
}
}
}
}
- Verifica di base. Il file richiesto ha l'estensione attesa?
- Verifica intermedia. Il file richiesto esiste?
- Verifica finale. Il file richiesto possiede il contenuto MIME atteso?
Il terzo step è una verifica di integrità finale. Dobbiamo essere sicuri che il file richiesto sia effettivamente un file PDF e non ad esempio un file PHP come è avvenuto in passato con il plugin WordPress di Revolution Slider.