Bloquer saisie manuelle dans input de type=file

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Bloquer saisie manuelle dans input de type=file

par Devether » 14 déc. 2007, 12:59

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop
Ah ben un peu oui !! C'est surtout n'importe quoi si FF te permet de manipuler les données à l'intérieur de ce champ... ça veut dire qu'au moment de l'envoi du formulaire, tu pourrais regarder la valeur du champ, voir s'il s'agit un systeme windows ou unix, et modifier la valeur pour spécifier n'importe quel fichier qui se trouverait sur le disque de l'utilisateur à son insu ? :shock:
Effectivement mais c'est pourtant le cas :twisted:

Le mieux c'est dans ton contrôle de données envoyées (que tu ne manques naturellement pas de faire en php ;)), est de vérifier avant de faire le move_upload_file() qu'il n'y a pas eu d'erreur d'upload (ou que le fichier ne fait pas 0ko, mais de mémoire y a une erreur adaptée)
Oui je savais que je pouvais faire comme ça mais je voulais évité que ce soit le serveur qui effectue le test.
Enfin bref c'est ce que j'ai fais :
- Mon formulaire de téléchargement envoi les données POST vers une iframe qui affiche la liste des fichiers uploadés.
<form name="up_form" id="up_form" target="ifra" method="post" enctype="multipart/form-data" action="upload.php">
...
<iframe id="ifra" name="ifra"></iframe>
- Dans mon script d'upload je met une variable à true si le fichier est <0 octet en empéchant sa copie dans le répertoire de destination.
if ($_FILES['myfile']['size'] > 0) {
   $zerofile = false;
}
else {
   $zerofile = true;
}
- J'envoi cette variable vers ma fonction de remplissage de l'iframe.
list_files($init_path, $zerofile);
- Je ne fais appel a une fonction JS qui affiche un alert('Fichier non valide!') que si cette variable est à true.
<?php
...
if ($zerofile) {
 ?>
   <script type="text/javascript">
      alert('Fichier non valide!');
   </script>
<?php
}
...
?>
J'aimerais préciser que même si le $_FILE['myfile']['size'] = 0 et bien le $_FILE['myfile']['error'] = 0 aussi.

Tout ça pour dire que j'ai résolu mon problème. Merci beaucoup pour votre aide. :wink:

par Ryle » 14 déc. 2007, 11:29

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop
Ah ben un peu oui !! C'est surtout n'importe quoi si FF te permet de manipuler les données à l'intérieur de ce champ... ça veut dire qu'au moment de l'envoi du formulaire, tu pourrais regarder la valeur du champ, voir s'il s'agit un systeme windows ou unix, et modifier la valeur pour spécifier n'importe quel fichier qui se trouverait sur le disque de l'utilisateur à son insu ? :shock:

J'vois pas vraiment de solution à ton problème.. si l'utilisateur met n'importe quoi dans les champs d'un formulaire, tu te retrouves avec n'importe quoi comme données... Le mieux c'est dans ton contrôle de données envoyées (que tu ne manques naturellement pas de faire en php ;)), est de vérifier avant de faire le move_upload_file() qu'il n'y a pas eu d'erreur d'upload (ou que le fichier ne fait pas 0ko, mais de mémoire y a une erreur adaptée)

En contournement, tu dois pouvoir utiliser un upload de fichier avec flash (en recherchant les scripts de gestion d'upload multiples, tu dois pouvoir en trouver facilement) qui ne proposeront généralement pas l'accès en saisie à un champ texte...

par Devether » 14 déc. 2007, 10:51

Quelle est la raison de cette vérification ?
Est-ce que, si tu saisis du texte "à la main", des données POST sont envoyées ?
Les données POST sont envoyées quand on clique sur un bouton télécharger. Je fais bien une verification de l'extension du fichier avant l'envoi mais il y a un autre problème qui se pose si l'extension est bonne.

Ex : je tape dans le champ "toto.jpg" (jpg étant autorisé) qui n'existe pas, et bien il me créer un fichier "toto.jpg" de 0 octet.
Je pourrais faire un test coté serveur sur les fichiers de 0 octet mais j'aurais aimé qu'on ne puisse rien écrire dans le champ...
impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.
:cry: Pas glop

par zeus » 14 déc. 2007, 09:02

Quelle est la raison de cette vérification ?
Est-ce que, si tu saisis du texte "à la main", des données POST sont envoyées ?

par Truc » 14 déc. 2007, 00:41

:lol: Ok triple boulays... :oops:

Le type file est en effet très spécial (em****ant).
Il n'est jamais traité de la même manière suivant le navigateur.
J'avoue même jamais pensé à faire une telle vérification :-k

impossible de toucher à la valeur du champ en javascript sous IE7... donc je dirais que ce n'est pas possible.

par Devether » 13 déc. 2007, 18:31

J'y avais déja pensé :wink:
Mais je vous rappelle qu'il est question d'un input de type "file".
Les readonly et disabled empechent le clic sur "Parcourir..."

Ce que je veux c'est pouvoir choisir un fichier avec le bouton "Parcourir..." mais qu'il soit impossible d'entrer le chemin d'un fichier à la main.

par AB » 13 déc. 2007, 17:56

La ç'est encore plus parlant :
<body>
<form action="" method="post">
<p>
<input type="text" disabled="disabled" name="disabled" value="YES" />
<input type="text" readonly="readonly" name="readonly" value="YES" />
<input type="submit" value="ok" name = "ok" />
</p>
</form>

<?php !empty($_POST)? print_r($_POST) :'';?>
</body>
:)

par Truc » 13 déc. 2007, 17:48

J'ai cherché un lien pour appuyer mes propos m'a fait perdre du temps... :^o

par Ryle » 13 déc. 2007, 17:44

Mouah ah ah !!
Vous n'êtes pas assez rapides, bande de petits scarabés !! ;)

par Truc » 13 déc. 2007, 17:43

Apparemment tu assaies de reproduire l'effet readonly ou disabled

Si je me rappel bien avec "disabled" il n'y a pas de valeur POST envoyée après validation contrairement à "readonly".

EDIT: Joli tir goupé les gars 8-)

par AB » 13 déc. 2007, 17:43

disabled="disabled"

Edit Encore grillé par Ryle!

par Ryle » 13 déc. 2007, 17:43

As-tu essayé les attributs readonly ou disabled selon ce que tu veux faire ? :)

(ca fonctionnera également sous FF sans que tu n'ais besoin de coller de js)

Bloquer saisie manuelle dans input de type=file

par Devether » 13 déc. 2007, 17:13

Bonjour,


En fait j'ai réussi a faire cela mais il n'y a que dans Firefox que ça fonctionne.

Code : Tout sélectionner

<input type="file" id="myfile" name="myfile" onkeyup="this.value='';" />
Sous IE on peut noter tout ce qu'on veut dans le champ de saisie.
J'ai testé avec onkeypress, onchange, onfocus ... niet!

Donc je vous demande comment bloquer la saisie sous IE ?

Merci d'avance,
Devether.