Controllo sui campi

  • Creatore Discussione Creatore Discussione piccino
  • Data di inizio Data di inizio

piccino

Nuovo Utente
9 Dic 2011
7
0
0
Salve a tutti, è evidente che sono nuovo del forum, quindi non so di preciso se se ne è già parlato della questione che vi sto porgendo, comunque vengo al punto;
Ho un Sito con form mail strutturato per l'invio di email con allegato, con form e relativo php:

questo é il form:
HTML:
<form action="form.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="destinatario" value="info@ilmiosito.it">
<table  style="border:0;color:white;float:left">
<tr>	
  <td>Tua Mail:</td>
  <td><input type="text" name="mittente" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Oggetto:</td>
  <td><input type="text" name="oggetto" value="" style="width: 300px" /><br><br></td>
</tr>
<tr>
  <td>Messaggio:</td>
  <td style="width:300px"><textarea cols="20" rows="4" name="testomessaggio" style="width:300px;overflow:hidden;height:130px; max-width:300px;max-height:130px"></textarea><br>
  <br></td>
  </tr>
<tr>
  <td>Allega file:</td>
  <td style="width:305px"><input type="file" name="attachment" style="width:305px;" class="file_1"/><br>
  <br><br></td>
</tr>
<tr>
  <td colspan="2"><input type="image"  value="submit"  src="images/invia2.png" style="float:right" /></td>
</tr>
</table>
</form>



questo è il php:

PHP:
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$mittente = $_POST['mittente'];
$oggetto = $_POST['oggetto'];
$messaggio = $_POST['messaggio'];

// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato))
{
  // Apro e leggo il file allegato
  $file = fopen($allegato,'rb');
  $data = fread($file, filesize($allegato));
  fclose($file);

  // Adatto il file al formato MIME base64 usando base64_encode
  $data = chunk_split(base64_encode($data));

  // Genero il "separatore"
  // Serve per dividere, appunto, le varie parti del messaggio.
  // Nel nostro caso separerà la parte testuale dall'allegato
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  
  // Aggiungo le intestazioni necessarie per l'allegato
  $headers .= "\nMIME-Version: 1.0\n";
  $headers .= "Content-Type: multipart/mixed;\n";
  $headers .= " boundary=\"{$mime_boundary}\"";

  // Definisco il tipo di messaggio (MIME/multi-part)
  $msg .= "This is a multi-part message in MIME format.\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Questa è la parte "testuale" del messaggio
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $messaggio . "\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Aggiungo l'allegato al messaggio
  $msg .= "Content-Disposition: attachment;\n";
  $msg .= " filename=\"{$allegato_name}\"\n";
  $msg .= "Content-Transfer-Encoding: base64\n\n";
  $msg .= $data . "\n\n";

  // chiudo con il separatore
  $msg .= "--{$mime_boundary}--\n";
}
else
{
  $msg = $messaggio;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
  echo "<p>Mail inviata con successo!</p>";
}else{
  echo "<p>Errore!</p>";
}
?>

Il punto è che funziona perfettamente, arrivano tutte le parti compreso l'allegato, con il classico "Mail inviata con successo!" ma il problema è che non da "Errore" se non si compilano i campi, e non si allega nulla;

in poche parole se si clicca su "Invia" senza compilare e allegare nulla, da sempre "Mail inviata con successo!", e ovviamente non invia nulla.

Se si compilano i campi ma non si allega nulla, da sempre "Mail inviata con successo!" e arriva l'email, con i campi, ovviamente senza allegato.

Se si compila solo l'Oggetto e il Messaggio, senza compilare il campo "Email", da sempre "Mail inviata con successo!" e arriva l'email, con il mittente sconosciuto e ovviamente senza allegato.

Quello che vorrei e la pagina "Errore" se non si compilano almeno i campi testuali.

Sicuramente manca qualcosa al php, ma cosa?

Qualcuno saprà aiutarmi?

Un Grazie anticipato è cosa buona e giusta!

 
ciao
benvenito nel forum e, per questa volata perdonato.
è meglio la prossima che tu scriva un post tuo senza accodarti.
comunque: devi mettere dei controlli ai vari $_POST:
se vuoti (soprattutto se qualcuno deve essere obbligatorio)
se contengono porcherie es. <script>...</script>
se gli allegati sono permessi (non è bene ricevere un bel cancella_tutto_hard_disk.exe)
fatti i controlli sopra allaora invii altrimenti no e fai tornare al form
poi non mettere nel form il tuo indirizzo email è leggibile anche se il campo è hidden, ma mettilo direttamente nel php

poi (ultimo) abbandona la funzione mail() e leggiti tra gli articoli di mrvm l'uso della classe phpmailler
 
Grazie della immediata risposta, il presentimento che il php nella sua "troppa" semplicità, fosse vulnerabile ce lo avevo, nel provarlo ho allegato di tutto, ed arrivava "tutto". Nel guardalo a fondo è vero, non ci sono controlli.

Per il phpmailer, sto vedendo proprio ora cose direi interessanti, ti terrò aggiornato.

Grazie ancora
 

Discussioni simili