conseil pour un formulaire avec pièce jointe

Petit nouveau ! | 8 Messages

23 sept. 2010, 12:57

Bonjour à tous,

je me tourne vers vous pour la réalisation d'un formulaire avec pièce jointe , si vous pouviez m'indiquer en matière de sécurité les différents point à prendre en compte et m'aider à comprendre mes erreurs .

A l'heure actuel je n'ai pas encore fais de vérification de ce formulaire car j'hésite sur un vérif tout en php ou avec du javascript ...

Quand je teste à l'état actuel j'ai ces erreurs ci :
Warning: fread(): supplied argument is not a valid stream resource et Warning: fclose(): supplied argument is not a valid stream resource qui serait dû à des droits d'écriture sur le fichier du serveur de mon hébergeur donc j'ai mis les droits d'écriture sur ce dernier mais rien y faire je reçois toujours la même erreur







le formulaire
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


<title>contact</title>

</head>

<body>
<form method="post" enctype="multipart/form-data" action="chargement.php">
<fieldset>
<legend>Contact</legend>
<hr/>

<label for="nom">Nom :</label><br/>
<input type="text" name="nom" tabindex="1"/>



<br />

<label for="prenom">Prenom : </label><br />
<input type="text" name="prenom" size="30" tabindex="2"/>



<br />

<label>email : </label><br />
<input type="text" name="email"size="30" tabindex="3"/>



<br /><br />

<label>Service à contacter : </label><br />
<select name="service">
<option value="information">Information</option>
<option value="sav">Service apres vente </option>
<option value="daf">Finances</option>
<option value="test">Test</option>
</select>

<br /><br />

<label>Dossier client:</label><br />

oui<input type="radio" name="dossier[] " value="oui" onClick="document.getElementById('div_client').style.display='none'; document.getElementById('div_client').style.display='block';"/>
non<input type="radio" name="dossier[] " value="non" onClick="document.getElementById('div_client').style.display='block'; document.getElementById('div_client').style.display='none';"/>


<br/><br/>

<div id="div_client" style="display:none;">
<label> numero de dossier </label> <br/>
<input type="text" name="client" />
</div>



<br />

<label>sujet : </label><br />
<input type="text" name="sujet"size="30" tabindex="4"/>



<br />
<br />


<label>Commentaire</label><br/>
<textarea name="message" cols="60" rows="8"/>
</textarea>


<input type="hidden" name="MAX_FILE_SIZE" value="30000"/>

<br/><br/>
<label>Fichier à envoyer </label><br/>

<input type="file" name="fichier_utilisateur" size="60"/>
<br/>


<br /><br />
<input type="submit" name="transfert" value="Envoyer"/>

</fieldset>

</form>


</body>
</html>
le fichier de chargement

<?php
	
	//declaration variable
	$nom = stripslashes ($_POST['nom']);
	$prenom = stripslashes( $_POST['prenom']);
	$email = stripslashes  ($_POST['email']);
	//verification des adresse mail
	if(!in_array($serviceMail,array("information","juriste","association","test"))){$serviceMail="information";}
	$serviceMail= array("information","juriste","association","test");
	foreach($serviceMail as $var)
	{
	$array[$var] = $_POST['Array'][$var];
	}
	$dossier=$_POST['dossier[]'];
	$client=stripslashes ($_POST['client']);
	$sujet=stripslashes ($_POST['sujet']);
	$commentaire=stripslashes ($_POST['commentaire']);
	$fichier=$_POST['fichier'];
	$upload=$_POST['upload'];
	$to="[email protected]";
	
	
	 
	if( isset($_POST['upload']) ) // si formulaire soumis
	{
	$content_dir = 'upload/'; // dossier où sera déplacé le fichier
	$tmp_file = $_FILES['fichier_utilisateur']['tmp_name'];
	if( !is_uploaded_file($tmp_file) )
	{
	exit("Le fichier est introuvable");
	}
	// on vérifie maintenant l'extension
	$extensions_ok = array('pdf', 'doc', 'jpg', 'jpeg');
	$type_file = $_FILES['fichier']['type'];
	if( !in_array( substr(strrchr($_FILES['fichier_utilisateur']['name'], '.'), 1), $extensions_ok ) )
	{
	 $erreur = 'Veuillez sélectionner un fichier de type pdf, doc, jpeg ou jpg !';  
	}
	
	// on copie le fichier dans le dossier de destination
	$name_file = $_FILES['fichier_utilisateur']['name'];
	if( !move_uploaded_file($tmp_file, $content_dir . $name_file) )
	{
	exit("Impossible de copier le fichier dans $content_dir");
	}
	echo "Le fichier a bien été uploadé";
	}
	

	
	//=====Lecture et mise en forme de la pièce jointe
	$fichier1  = fopen($fichier, "r+" );
	$attachement = fread($fichier1, filesize($fichier));
	$attachement = chunk_split(base64_encode($attachement));
	fclose($fichier);
	//==========
	
	//=====Création de la boundary
	$boundary = "-----=".md5(rand());
	$boundary_alt = "-----=".md5(rand());
	//==========
	
	
	//=====Création du header de l'e-mail
	$header = "From: $email\n";
	$header.= "Reply-to: $emai\n";
	$header.= "MIME-Version: 1.0\n";
	$header.= "Content-Type: multipart/mixed;\n boundary=\"$boundary\"\n";
	//==========
	
	//=====Création du message
	
	$message = "\n--".$boundary."\n";
	$message = "--" . $boundary . "\n";
	$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
	$message .= "Content-Transfer-Encoding: 8bit\n\n";
	$message .= "<html><body>
				<h3 style='font-family: Maiandra GD; color:red;text-decoration:underline;text-indent:30px;' >".$client." </h3>
				<p style='font-family: Maiandra GD;text-align:justify;' >" .$commentaire. "</p>
				</body></html>";
	$message .= "\n";
	$message.= "Content-Type: multipart/alternative;\n boundary=\"$boundary_alt\"\n";
	$message.= "\n--".$boundary_alt."\n";

	
	//=====On ferme la boundary alternative
	$message.= "\n--".$boundary_alt."--\n";
	//==========
	
	
	
	$message.= "\n--".$boundary."\n";
	
	//=====Ajout de la pièce jointe
	$message.= "Content-Type: application/pdf;\n name=\"$fichier\"\n";
	$message.= "Content-Transfer-Encoding: base64\n";
	$message.= "Content-Disposition: attachment;\n filename=\"$fichier\"\n";
	$message.= "\n".$attachement."\n\n";
	$message.= "\n--".$boundary."--\n";
	//==========
	//=====Envoi de l'e-mail
	mail($to,$sujet,$message,$header);

    ?>
Merci par avance pour vos réponses apportés

Mammouth du PHP | 19672 Messages

23 sept. 2010, 13:56

...si vous pouviez m'indiquer en matière de sécurité les différents point à prendre en compte...
...
...j'hésite sur un vérif tout en php ou avec du javascript ...
Principe de base en matière de sécurité : ne jamais baser la validation d'un formulaire uniquement sur le JavaScript. Le JavaScript est un langage client, donc exécuté par le navigateur de l'internaute : si ce dernier a de mauvaises intentions, il peut purement et simplement désactiver le JavaScript : les données seraient alors envoyées sans vérification.

Donc, il est impératif d'avoir une validation coté serveur (PHP) et tu peux ajouter par la suite une validation en JavaScript, ce qui va améliorer la fluidité et l'ergonomie générale.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

23 sept. 2010, 14:05

je te remercie pour ta réponse pour la validation , pour le code que je fais pourrais tu m'apporter ton aide stp pour les erreurs produites ?

Merci

Mammouth du PHP | 19672 Messages

23 sept. 2010, 14:08

Pour ce qui est de ton erreur, à première vue, l'erreur est que tu tentes d'envoyer le contenu de la variable $fichier au lieu de $tmp_file, vérifie donc ça.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

23 sept. 2010, 14:17

oki merci :-) je te remercie