Php Upload dans répertoire protégé par htaccess/htpasswd

Eléphant du PHP | 428 Messages

22 mars 2010, 22:16

Bonjour,

J'ai créé un formulaire d'upload de fichiers et je désirerai placer les fichiers dans un répertoire protégé par htaccess/htpasswd.
Malheureusement lors de l'upload (et à mon avis au niveau de move_uploaded_file), il m'affiche une fenêtre de login me demandant le nom d'utilisateur et mot de passe alors que je suis déjà loggué. On dirait que l'upload crée une nouvelle instance et de par ce fait, me redemande de me logguer.

En enciodant les codes d'accès dans cette fenêtre de login que l'upload me propose, ça ne marche pas! Mes codes d'accès sont invalides alors qu'ils fonctionnent et je n'ai pas d'autre htaccess.

Pour l'instant et afin que je puisse uploader j'ai fait ceci qui désactive temporairement le htaccess, me permettant d'uploader le fichier.
if (is_file('/home/monsiteweb/www/site/.htaccess')) {
rename("/home/monsiteweb/www/site/.htaccess", "/home/ledcom/www/manager/.htaccess0");
}
Mais ce n'est pas une solution en sois sachant que j'ai également besoin de l'htaccess pour définir les valeurs maximum d'upload du php ini.

Ma question est donc de savoir si il existe une solution viable me permettant l'upload de fichier via formulaire php dans un répertoire protégé par htaccess ?

Merci pour vos réponses,
raph

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

23 mars 2010, 00:54

A priori ton problème est ailleurs...

Le fichier htaccess contrôle les accès aux dossiers & fichiers à travers le navigateur. Mais lorsque tu upload un fichier sur ton serveur et que tu demandes à php de le déplacer, php utilise le système de fichier pour le déplacer dans le dossier souhaité. Il ne passe donc pas par le serveur web et ne solicite donc pas le htaccess.

Tu dois donc avoir quelque chose d'autre dans ton code, qui te redirige vers une nouvelle page (contrôlée par le htaccess) avant ou après ton traitement php :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 428 Messages

23 mars 2010, 13:17

Salut,

J'ai beau cherché, je ne vois pas pourquoi il me redemande les codes d'accès htaccess...
Voici le code source de ma page qui traite les fichiers uploadés :
<?php

	function formatFileName($aFileName, $aMaxLength = 50) {
	 $aFileName = strToLower(subStr($aFileName, 0, $aMaxLength));
	 $aFileName = ereg_replace('[^a-zA-Z0-9,._\+\()\-]', '_', $aFileName);

	 return $aFileName;
	}
	
	 // On inclus le fichier de configuration
	 define('AZERTY', 1);
	 require_once ('../config.inc.php');
	
	if ((isset ($_GET['galid']) AND !empty ($_GET['galid']) AND is_numeric ($_GET['galid'])) AND (isset ($_GET['intitle']) AND !empty ($_GET['intitle']))) {
	 $galid = $_GET['galid'];
	 $int_title = $_GET['intitle'];

	 $dir_orig = $CfgRelDir.DIRECTORY_SEPARATOR.$CfgDir_Gallery.DIRECTORY_SEPARATOR.$int_title.DIRECTORY_SEPARATOR.$CfgDir_Photos;
	 	 
	 $file_name = formatFileName($_FILES['Filedata']['name']);
	 $orig_file_name = $_FILES['Filedata']['name'];
	 $file_info = pathinfo($file_name);
	 $file_title =  basename($file_name,'.'.$file_info['extension']);

	 $file_tmp = $_FILES['Filedata']['tmp_name'];
	 $file_error = $_FILES['Filedata']['error'];
	 $file_size = getimagesize($file_tmp);
	 $file_type = $file_size['mime'];
	 list($width, $height) = getimagesize($file_tmp);
	 $file_ratio = $width/$height;
	 
	 $auth_width = 1024;
	 $auth_height = 768;
	 
		if (!is_dir($dir_orig)) {
		 $error ='Veuillez indiquer un r&eacute;pertoire destination correct !';
		} elseif (!is_writeable($dir_orig)) {
		 $error ='Veuillez sp&eacute;cifier des droits en &eacute;criture pour le r&eacute;pertoire destination !';
		} elseif (file_exists ($dir_orig.DIRECTORY_SEPARATOR.$file_name)) {
		 $error = 'Un fichier portant le m&ecirc;me nom existe d&eacute;j&agrave;';
		} elseif  ($width !== $auth_width AND $height !== $auth_height) {
		 $error = 'La dimension maximale autoris&eacute;e est de 1024x768 !';
		} elseif ($file_error == UPLOAD_ERR_OK) {

			if (($file_type == "image/pjpeg" OR $file_type == "image/jpeg") OR ($file_type == "image/x-png" OR $file_type == "image/png") OR $file_type == "image/gif") {
		
				if (move_uploaded_file($file_tmp, $dir_orig.DIRECTORY_SEPARATOR.$file_name)) {
				 $error = false;
				
				 $db = mysql_connect($CfgServerHost, $CfgServerUser, $CfgServerPassword) or die('Error: Could not connect to database');
				 mysql_select_db($CfgDatabase,$db) or die ('Error: Cannot select database');
			 
				 $req_main="INSERT INTO $CfgTableObjects (gallery_id, object_type, object_title, object_filename) VALUES ('$galid', 'photo', '$file_title', '$file_name')";
				 $res_main=mysql_query($req_main) or die(mysql_error());
				
				} else {
				 $error = 'Le fichier temporaire n\'a pas pu etre d&eacute;plac&eacute;.';
				}
			} else {
			 $error = 'Le fichier n\'est pas une image valide (JPG, JPEG, PNG, GIF autorisées).';
			} 
		} else {

			switch ($file_error) {

			 case UPLOAD_ERR_INI_SIZE:
			 $error = 'Le fichier d&eacute;passe la valeur sp&eacute;cifi&eacute;e pour upload_max_filesize dans php.ini.';
			 break;

			 case UPLOAD_ERR_PARTIAL:
			 $error = 'Le fichier n\'a &eacute;t&eacute que partiellement upload&eacute;.';
			 break;                            

			 default:
			 $error = 'Aucun fichier n\'a &eacute;t&eacute upload&eacute;.';
			}
		}

		if ($error) {
		 unlink($file_tmp); 
		 $return = array(
		 'status' => '0',
		 'error' => $error
		 );
		} else {
		 $return = array(
		 'status' => '1',
		 'name' => $orig_file_name
		 );
 
		 $return['hash'] = md5_file($dir_orig.DIRECTORY_SEPARATOR.$file_name);
		 $info = @getimagesize($dir_orig.DIRECTORY_SEPARATOR.$file_name);
 
			if ($info) {
			 $return['width'] = $info[0];
			 $return['height'] = $info[1];
			 $return['mime'] = $info['mime'];
			}
		}

	 echo json_encode($return);
	 exit();
	}
Avez-vous une idée de ce qui se passe ?

Merci,
raph

Eléphant du PHP | 428 Messages

23 mars 2010, 15:01

J'ai trouvé mais il me reste un légé problème.
En effet, mon système d'upload envoi les fichiers par flash interposé.
C'est dans l'uploader flash que réside le problème.

J'ai trouvé une solution me permettant d'uploader quand même mes fichiers via htaccess
Le problème est que j'utilise filesmatch dans le htaccess pour autoriser la page d'upload mais ça ne marche pas comme je le voudrais.

CE QUI NE PARCHE PAS

Code : Tout sélectionner

<FilesMatch "(uploader\.php)$"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>

CE QUI MARCHE

Code : Tout sélectionner

<FilesMatch "\.(php)$"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>
Comme vous le remarquez, ce qui marche est l'autorisation des extensions PHP MAIS ce n'est pas une bonne solution, je voudrais autoriser seulement le fichier uploader qui contient les fichiers js et le formulaire nécessaire pour l'envoi de fichiers.

Donc, à moins que je ne me trompe, il faut que j'autorise uploader.php et normalement, le tour est joué... Mais ça bug, je n'arrive pas à autoriser un fichier.

Avez-vous une idée ?

Merci,
raph

Eléphant du PHP | 428 Messages

23 mars 2010, 15:37

Code : Tout sélectionner

<FilesMatch "(votrepage\.php)"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>

Mammouth du PHP | 985 Messages

23 mars 2010, 16:33

Je ne comprends pas ton .htaccess.

Si tu veux juste autoriser un fichier dans un dossier, tu peux faire par exemple comme ceci:

Code : Tout sélectionner

order allow,deny <Files fichier.php> allow from all </Files> deny from all
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 428 Messages

23 mars 2010, 17:30

Salut Dr@ke,

Après avoir recherché sur le web, je suis tombé sur cet article ... c'est pour ça que j'utilise filesmatch.

"Pour info, il faut ajouter que depuis Apache 1.3, il est conseillé d'utiliser la balise <FilesMatch> à la place de la balise <Files>.
Cette nouvelle balise ne supporte aussi qu'un seul argument mais on peut traiter plusieurs fichiers grâce à une expression régulière. "

http://www.commentcamarche.net/contents ... pacht.php3


Etant donné que j'upload via un système basé sur une appli flash et que mon site est protégé par htaccess, je dois autoriser la page d'upload dans l'htaccess.
http://blog.m-schmidt.eu/2009/06/19/fla ... ntication/

A+
raph
Modifié en dernier par visualight le 23 mars 2010, 17:38, modifié 1 fois.

Mammouth du PHP | 985 Messages

23 mars 2010, 17:37

Using FilesMatch and Files in htaccess

Files and FilesMatch to target multiple files and using Regular expressions using .htaccess files on Apache.

NOTE: FilesMatch should be used instead of Files when dealing with multiple files
Ici on Deal qu'un seul fichier sans expressions régulières.
De toute façon, ce n'est pas le fond du problème ici.

Le fond du problème c'est d'utiliser un .htaccess correct :wink:

[EDIT]
Il ne faut pas croire tout ce que l'on li sur les blogs..
Rien que ceci est un non sens pour moi:

Code : Tout sélectionner

Allow from all Deny from none
De plus les parenthèses sont utilisées quand on utilise plusieurs conditions.
Et ton .htaccess pris tel quel, n'interdit rien du tout.

Je passe sur le reste, et mon intervention était surtout si d'autres utilisateurs lisaient le topic ensuite.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Mammouth du PHP | 985 Messages

23 mars 2010, 19:43

Sinon juste pour info, ton lien commentcamarche:
Comme je l'ai déjà dit dans d'autres Topics, la balise <LIMIT> ne doit pas s'utiliser de cette façon quand on veut protéger un dossier ou un fichier:

Code : Tout sélectionner

<LIMIT GET POST> # ... </Limit>
Si l'utilisateur accède au dossier avec une méthode HTTP fictive, et donc non GET et POST, eh bien il passe comme une lettre à la poste.

C'est un peu hors-sujet j'avoue, mais c'est juste pour dire qu'il ne faut pas prendre à la lettre tout ce que l'on lit :)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

edjay
Invité n'ayant pas de compte PHPfrance

12 juil. 2011, 22:35

<Directory /var/www/js/jquery.uploadify/>
allow from all
satisfy any
</Directory>