UPLOADER DES FICHIER DANSUN DOSSIER, SÉCURISÉ AVEC MOT DE PASSE

cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 21 oct. 2011 à 15:30 - Dernière réponse : cs_emilia123 122 Messages postés mercredi 19 décembre 2001Date d'inscription 5 janvier 2009 Dernière intervention
- 24 oct. 2011 à 16:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

http://codes-sources.commentcamarche.net/source/53694-uploader-des-fichier-dansun-dossier-securise-avec-mot-de-passe

Afficher la suite 
cod57 1661 Messages postés dimanche 7 septembre 2008Date d'inscription 11 septembre 2013 Dernière intervention - 22 oct. 2011 à 10:39
bonjour
@En lui même le code est pas trop mal pour un débutant (ya bien pire)...
@TychoBrahe d'accord avec toi en espérant qu'il poste un code plus sécurisé

tu devrais séparé le code, quelques idéees :

1/Un formulaireadmin.html saisir login + password <form action='traitement.php' method="post"> ...

2/tu vérifies dans traitement.php les identifiants
(depuis une base ou un fichier caché dans un répertoire protégé par .htaccess)

si ok tu crées une variable $_SESSION['client']=true
si true===$_SESSION['client'] tu affiches le formulaire d'upload
echo $form;

sinon retour à formulaireadmin.html par la fonction header()
header('Location: formulaireadmin.html');exit;

il faut aussi faire une fonction de déconnection est un bouton se déconnecter dans traitement.php (et ou) par un système de cookies une déconnection automatique au bout de x secondes

4/$form pointe vers upload.php
qui contient la function upload avec tout les trucs habituels de securité

en vrac + ceux que j'oublie
protection acces de $form sur upload par token ou captcha
nettoyage du 'name' par un un filtre (preg_replace)
verification du mine
verification de l'extension du fichier envoyé + tableau des extensions autorisées
verification du repertoire et du déplacement is_uploaded()
verification de l'existence du fichier (file_exists)dans le dit repertoire (contre les doublons)
deplacement vers une arborescence inferieur ...
exemple :
./titi/toto/traitement.php
./titi/toto/upload.php
tu deplaces les fichiers vers ./images/
...
stockage eventuelle dans mysql infos
date heure : membre : depuis ip : déplace fichier vers : x

si l'upload
$_POST=$_GET=$_FILES=array();
header('Location: merci.html');exit;
tu affiches les fichiers avec de l'url rewriting
et un bouton retour vers traitement.php

sinon
header('Location: byebye.php');exit;

byebye.php
<?php
session_start();
$_POST=$_GET=$_FILES=array();
unset_session();
destroy_session();
header('Location: http://monsite.fr/formulaireadmin.html');exit;
?>

++
cs_emilia123 122 Messages postés mercredi 19 décembre 2001Date d'inscription 5 janvier 2009 Dernière intervention - 24 oct. 2011 à 08:31
Bonjour,

@TychoBrahe : pourquoi indiques tu :
---------------------------------------
$login = (isset($_POST["login"])) ? $_POST["login"] : "";
Useless au possible, à supprimer, et pareil pour son collègue.
---------------------------------------
Inutile? si ca n'est pas fait et que le serveur est configuré pour afficher les warning, ca affichera un joli petit message d'avertissement... c'est pas top pour l'internaute.

Comme le propose COD57, il serait intéressant de découper le script en plusieurs parties :
1) identification avec mise en session et redirection vers upload si OK,
2) upload si l'identification est OK

Concernant le script actuel, il y a un petit pb avec les "echo" d'erreur (ligne 18, 26, 38 et 42).
Dans l'état actuel, ils sont affichés avant le début du code HTML, ce qui n'est pas correct.
Il faudrait enregistrer le message dans une variable et l'afficher ensuite dans le formulaire.
Pense aussi à ne pas utiliser de javascript et d'"alert" pour ce genre de message. Un joli petit cadre au dessus du formulaire fait beaucoup plus propre (et pro) qu'une vilaine alerte javascript.

Bon courage pour la suite.

EM.
raizzo 2 Messages postés mercredi 19 octobre 2011Date d'inscription 24 octobre 2011 Dernière intervention - 24 oct. 2011 à 15:08
Merci à tous pour vos commentaire d'aide.
Je vais modifier le code pour qu'il soit plus correct.
TychoBrahe 1310 Messages postés samedi 31 janvier 2009Date d'inscription 5 juin 2013 Dernière intervention - 24 oct. 2011 à 15:24
@emilia123 :
"Inutile? si ca n'est pas fait et que le serveur est configuré pour afficher les warning, ca affichera un joli petit message d'avertissement... c'est pas top pour l'internaute."
Tu as tort. Juste après ceci, il test à nouveau ces variables à l'aide de empty(). Comme tu peux le constater dans la documentation, empty() considère une variable non déclarée comme vide et du coup n'affiche aucun avertissement, pas même une notice. Tu peux tester si tu doutes de ce comportement. Bref, vu que empty() remplis le rôle de isset() en plus de tester autre chose, il est parfaitement inutile de faire ce isset().

Un autre argument que j'ai contre cette affectation (même après test) est plus d'ordre sémantique. Le fait que la valeur se trouve dans la variable $_POST (ou $_GET) est porteur de sens : on sais que cette donnée est fournie par l'utilisateur. En utilisant une variable perso on perd cette signification et il faut se souvenir soi même de cette provenance. Vu qu'il ne faut *jamais* se fier à une donnée fournie par l'utilisateur, je trouve dangereux ce genre de choses qui peut faire oublier au développeur la potentielle dangerosité de que contient la variable.
cs_emilia123 122 Messages postés mercredi 19 décembre 2001Date d'inscription 5 janvier 2009 Dernière intervention - 24 oct. 2011 à 16:38
@TychoBrahe : ok je comprend maintenant ce que tu voulais dire par "inutile", mais du coup ta réponse était incomplète :)

J'avais compris que c'était uniquement le "isset" qui était inutile et donc à supprimer (vu que tout le reste du code utilise $login et $pass).

Si on ne supprimait que le isset en laissant l'assignation qui est en place, on aurait un warning pour css lignes si il n'y avait pas de login/pass à traiter.

Mais en effet si on supprime complètement l'assignation et qu'on remplace partout dans le code les variables d'origine, le "empty" suffit.

EM.
Commenter la réponse de cod57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.