8791 sujets

Développement web côté serveur, CMS

Bonjour,

Pouvez-vous m'aider ?
Je vous remercie d'avance.
Je m'explique.

En fait, j'arrive très bien à uploader dans la base de données.

C'est après que les problèmes commencent.
J'effectue alors les opérations suivantes.
Je quitte la page (www.creaprint.be/avancement00.php).
Je relance la page (www.creaprint.be/avancement00.php).
Et là, cet upload pourtant chargé au préalable dans la base de données,
n'apparaît pas dans "remplir choisissez un fichier" par le nom de ce fichier déjà uploadé.
Pire, si je valide alors le formulaire, sans avoir à nouveau uploadé le fichier,
il "disparaît" de la base de données (la variable BLOB est alors vide).


Pour être au maximum lisible, j'ai fortement aéré les codes ci-dessous.

Pour enregistrer dans le record (tout fonctionne ici !)

if ($_FILES['facturepdf']['size'] > 0) {
	$fileName = $_FILES['facturepdf']['name'];
	$tmpName = $_FILES['facturepdf']['tmp_name'];
	$fileSize = $_FILES['facturepdf']['size'];
	$fileType = $_FILES['facturepdf']['type'];
	$fp = fopen($tmpName, 'r');
	$content = fread($fp, filesize($tmpName));
	$content = addslashes($content);
	fclose($fp);
}	
...
$bdc=$_GET['bdc'];		
$requeteNEW="UPDATE shop_commande SET ".
        ...
	"nofacture='".trim($_POST['nofacture'])."' ,".
	"facturepdf='".$content."' ,".
        ...	
	"WHERE refcommande='".$bdc."' ";
mysql_query($requeteNEW);


Pour lire dans le record (c'est la pagaille !)

$reqCommande="SELECT * FROM shop_commande ".
	"WHERE refcommande='".$bdc."' ";
$resCommande=mysql_query($reqCommande);
$back01=mysql_fetch_array($resCommande);
if ($back01) {
        ...
	$_POST['nofacture'] = $back01['nofacture'];
	$_FILES['facturepdf'] = $back01['facturepdf'];
	...
}
...


Voici le formulaire en html/php
	
<form name="envoiok02" action="avancement00.php?ok02=1&bdc=<?php echo $bdc; ?>" method="post" enctype="multipart/form-data">
...
  <table id="tablefin01" border="0" cellspacing="0" >
  ...
  <tr>
  <td colspan="2" height="25">Facture n°</td>
  <td><input name="nofacture" type="text" id="nofacture" height="17" size="8" value="<?php echo $_POST['nofacture']; ?>" class="zone2"></td>
  </tr>
  <tr>
  <td colspan="3" height="25"><input type="hidden" name="MAX_FILE_SIZE" value="2000000"><input type="file" id="facturepdf" name="facturepdf" value="<?php echo $_FILES['facturepdf']['name']; ?>" ></td>
  </tr>
  ...
  </table>
...
</form>

Modifié par jytest (07 Jul 2012 - 10:27)
Je désespère.
Quelque chose m'échappe.
Mais quoi ?
N'avez-vous pas une ou des idées pour moi débloquer cela ?
Merci d'avance.
Modérateur
Bonjour,

Un input de type file ne peut pas avoir de valeur par défaut pour des raisons de sécurité. Tu dois t'en servir uniquement pour envoyer un nouveau fichier.

Je ne sais pas exactement à quoi sert ton formulaire, mais à vue de nez, voici ce que tu devrais faire : si le champ input file est rempli par l'utilisateur, tu mets à jour le champ. S'il est laissé vide par l'utilisateur, tu ne mets pas à jour le champ (tu gardes ce qu'il y a déjà dans la base de données).

As-tu une raison particulière de vouloir stocker le fichier dans un champ BLOB? Il est généralement recommandé de stocker uniquement le nom ou le chemin du fichier dans la base de données et de stocker le fichier lui-même dans un répertoire sur le serveur.

Attention à l'injection SQL (faille de sécurité importante).
Modifié par Tony Monast (18 Apr 2012 - 04:07)
Tout d'abord, un immense merci.

Je pensais bien que cela n'était pas possible !
Mais qui ne risque rien n'a rien..

Merci de me conforter dans cette impossibilité.
Je me lance donc dans cette autre solution. Merci.

Par contre, je ne veux pas stocker dans la base de données
le chemin du document sur le domaine.
Car pour des raisons de sécurité (aspirateur web),
je ne veux pas que ces fichiers,
qui sont des factures comptables relatives aux commandes des clients,
soient trop facilement disponibles pour des personnes bien mal intentionnées...

Alors, j'évite l'injection SQL ?
ou j'évite les aspirateurs web ?
Qu'en penses-tu ?
Quelle est la solution la plus sûre (devrais-je dire, la moins mauvaise) ?

Merci pour ton aide !!!
Modifié par jytest (18 Apr 2012 - 08:37)
Si ce sont des données sensibles il parait logique que l'accès à ces pages soit restreint par une identification de l'utilisateur, ce qui suffit à garder les aspirateurs de site à l'écart.

L'injection SQL peut permettre d'accéder à l'intégralité de ta base de donnée par une personne plus mal intentionné qu'un aspirateur de site. Donc à mon goût il vaut largement mieux éviter l'injection. ^^
Modérateur
Bonjour,

Les documents des factures doivent être stockés dans un répertoire non accessible par le Web. Il sera donc impossible pour un utilisateur de récupérer un document auquel il n'a pas accès, qu'il utilise un navigateur Web ou un aspirateur de site. C'est ton application qui va gérer la sécurité et livrer les documents uniquement aux utilisateurs autorisés.

Se protéger contre l'injection SQL n'est pas facultatif. C'est l'un des points essentiels de sécurité à respecter lorsqu'on développe des applications.

Tu n'as pas à faire le choix difficile entre protéger tes documents sensibles ou protéger ton application des injections SQL. Tu peux et tu dois faire les deux. Smiley cligne
jytest a écrit :

Alors, j'évite l'injection SQL ?
ou j'évite les aspirateurs web ?
Qu'en penses-tu ?
Quelle est la solution la plus sûre (devrais-je dire, la moins mauvaise) ?


Grâce à ta jolie injection SQL on peut très bien accéder à tes factures stockées en base de données. Smiley cligne
Ok, bien compris !
Merci pour les explications...
Mais comment faire pour qu'un dossier soit "protégé dans un domaine ?
Le mieux c'est de le mettre dans un dossier parent du dossier www et qui est donc inaccessible depuis le web.
De fait, pour donner accès aux fichiers placés dans un tel répertoire il faut passer par PHP pour la récupération car tu ne peux plus le cibler directement par une url (fopen + header adéquat).
Modifié par moust (23 Apr 2012 - 12:37)
Merci à tous !
A Moust,
peux-tu m'aider en me disant comment faire,
puisque le site démarre de la racine...

Merci d'avance.
Modifié par jytest (24 Apr 2012 - 20:26)
Considérons le répertoire suivant :

/
/www/
/www/index.php
/files/
/files/fichier.pdf


// index.php

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="fichier.pdf"');
readfile('../files/fichier.pdf');


fichier.pdf est inaccessible directement depuis le web.
L'appel à index.php lance le téléchargement du fichier.

À toi de dynamiser tout ça pour d'apter à ton besoin.
Modifié par moust (25 Apr 2012 - 14:37)