OVH Cloud OVH Cloud

Lecture repertoire avec Safe Mode acti ve...

5 réponses
Avatar
Jean-Francois Ortolo
Bonjour

Pour ce qui est de la gestion des seuls fichiers, théoriquement ça
marche ( théoriquement, car je ne peux pas tester en réel pour
l'instant. ) Ceci d'après les commentaires des développeurs Américains
sur le site du PHP Manual.

Cependant, j'aimerais savoir si, compte tenu du fait que le
répertoire suivant:

/home/ortolojf/www/php/courses_anciennes

a pour gid/uid users/ortolojf,

à ce moment-là, si dans ce répertoire je met un script PHP avec ces
mêmes gid/uid ( par FTP donc ), ce script contenant les instructions
suivantes:

if(!($fp = @opendir('.')))
{ echo "Ouverture en écriture du répertoire courant
impossible<br>\n";
die("");
}

unset($line);
while($line = @readdir($fp))
{ unset($fline);
$fline = trim(str_replace("\n", "", $line));
if(ereg("essai[0-9][0-9]\-[0-9][0-9]\.txt", $fline))
@unlink($fline);
}

@closedir($fp);


Donc, le gid/uid du script sera: apache/apache , et celui du
répertoire courant: ortolojf/users , alors qu'on est en Safe Mode à On.

En supposant que je ne peux pas changer celà, les instructions
ci-dessus vont-elles fonctionner, et sinon, où celà va-t-il foirer ?


Vous voyez, que pour la gestion de mon site, qui crée des fichiers
temporaires, j'ai besoin de pouvoir supprimer ces fichiers temporaires,
alors même que je ne connais pas leurs noms exacts, seulement leurs
expressions rationnelles associées.

Je précise bien, que je supprime ces fichiers temporaires, une fois
par jour, je pourrais à la rigueur, enregistrer dans un fichier fixe,
les noms des fichiers temporaires créés, et puis lire ce fichier, et
supprimer les fichiers s'y trouvant. Je n'aime pas tellement cette idée,
qui me paraît peu sécurisée.

Comment faire dans ce cas, si les instructions ci-dessus ne
fonctionnent pas ?

Merci beaucoup de vos réponses.

Jean-François Ortolo

--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com

5 réponses

Avatar
Jean-Francois Ortolo
Bonjour

Personne ne sait ?

C'est pourtant simple: Le Safe Mode est à 'On', le serveur est un
serveur Aapache avec PHP comme module est non pas en SuExec.

Donc, l'uid/gid d'un script PHP qui s'exécute, sera celui du serveur
Apache ( apache/apache ), alors que l'uid/gid du répertoire courant,
sera celui de l'utilisateur FTP qui l'aura créé. ( avec les permissions
correctes, évidemment. )

Dans ces conditions, est-ce que le code suivant fonctionnera, et si
non, où s'arrêtera-t-il ?

// Début du code.

if(!($fp = @opendir('.')))
{ echo "Ouverture en &eacute;criture du r&eacute;pertoire courant
impossible<br>n";
die("");
}

unset($line);
while($line = @readdir($fp))
{ unset($fline);
$fline = trim(str_replace("n", "", $line));
if(ereg("essai[0-9][0-9]-[0-9][0-9].txt", $fline))
@unlink($fline);
}

@closedir($fp);

// Fin du code.


Merci beaucoup à toute personne pouvant me fixer les idées sur ce
problème, car je ne peux tester en réel actuellement, à moins de
m'abonner à Sivit, alors que je suis sur un mutualisé OVH pour encore un
an...

Bien à vous.

Amicalement.

Jean-François Ortolo
Avatar
dwojylac.nospam
Jean-Francois Ortolo wrote:

Bonjour
Bonjour


unset($line);
while($line = @readdir($fp))
{ unset($fline);
$fline = trim(str_replace("n", "", $line));
if(ereg("essai[0-9][0-9]-[0-9][0-9].txt", $fline))
@unlink($fline);
}

Une remarque : la doc de readdir précise :

/* Ceci est la façon correcte de traverser un dossier. */
while (false !== ($file = readdir($handle))) {
echo "$filen";
}

/* Ceci est la MAUVAISE façon de traverser un dossier. */
while ($file = readdir($handle)) {
echo "$filen";
}

Sur le reste, je n'ai jamais eu de pb pour effacer des fichiers dans un
dossier donné, si ceux-ci ont été crées par le serveur.

Est-ce une bonne chose de mettre ton script dans le même dossier où il
doit effacer les fichiers ? Pour les questions de sécurité que tu
évoques, est-ce que tes fichiers temporaires ne pourraient pas être
enregistrés dans un dossier spécifique protégé par un .htaccess ?

--
Dominique Wojylac http://wojylac.free.fr
Un proverbe chinois dit que lorsqu'on a rien à dire
on cite généralement un proverbe chinois.

Avatar
Jean-Francois Ortolo
Dominique wrote:

Une remarque : la doc de readdir précise :
/* Ceci est la façon correcte de traverser un dossier. */
while (false !== ($file = readdir($handle))) {
echo "$filen";
}

/* Ceci est la MAUVAISE façon de traverser un dossier. */
while ($file = readdir($handle)) {
echo "$filen";
}

Sur le reste, je n'ai jamais eu de pb pour effacer des fichiers dans un
dossier donné, si ceux-ci ont été crées par le serveur.

Est-ce une bonne chose de mettre ton script dans le même dossier où il
doit effacer les fichiers ? Pour les questions de sécurité que tu
évoques, est-ce que tes fichiers temporaires ne pourraient pas être
enregistrés dans un dossier spécifique protégé par un .htaccess ?



Bonjour Monsieur

Tout d'abord, merci de m'avoir répondu, car je cherche une réponse à
ma question, depuis déjà plusieurs jours.

Ensuite, c'est évident que du moment que les fichiers ont été créés
par un script PHP ( ce qui est le cas, puisque ces fichiers sont des
fichiers temporaires ), c'est évident donc, que si l'on a le nom du
fichier, il est possible de faire simplement celà: @unlink($fichier);
pour supprimer le fichier $fichier situé dans le répertoire courant.

Mais ( Grave ;) ) il y a un mais.

Pour accéder à ce nom de fichier, je suis obligé de lire le contenu
du répertoire courant, et de sélectionner les noms corrects de fichiers
à supprimer, d'après une expression rationnelle... Celà implique de
faire un opendir('.'), des readdir(), et un closedir(), d'où ma
question... Arf ! arf ! qui rencontrera, je le sens, bientôt une réponse:

Ces instructions de lecture de répertoire, sont-elles possibles,
sachant que le safe Mode est à 'On', et que l'interpréteur PHP
fonctionen comme module, et non pas en SuExec ?

Ouf. Enfin.

J'ai dit tout ce que j'avais à dire, demandé tout ce que j'avais à
demander, le tout c'est d'avoir des réponses...

Bien à vous.

Amicalement.

Jean-François Ortolo

--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com

Avatar
dwojylac.nospam
Jean-Francois Ortolo wrote:

Celà implique de faire un opendir('.'), des readdir(), et un closedir(),
d'où ma question... Arf ! arf ! qui rencontrera, je le sens, bientôt une
réponse:

Ces instructions de lecture de répertoire, sont-elles possibles,
sachant que le safe Mode est à 'On', et que l'interpréteur PHP
fonctionen comme module, et non pas en SuExec ?


un phpinfo() devrait te donner la réponse sur les fonctions desactivées
sur ton serveur et la configuration de safe_mode_gid

et ici la liste des fonctions désactivées par safe_mode
http://www.nexen.net/docs/php/annotee/features.safe-mode.functions.php

readdir n'y est pas...

--
Dominique Wojylac http://wojylac.free.fr
Un proverbe chinois dit que lorsqu'on a rien à dire
on cite généralement un proverbe chinois.

Avatar
Jean-Francois Ortolo
Dominique wrote:

un phpinfo() devrait te donner la réponse sur les fonctions desactivées
sur ton serveur et la configuration de safe_mode_gid

et ici la liste des fonctions désactivées par safe_mode
http://www.nexen.net/docs/php/annotee/features.safe-mode.functions.php

readdir n'y est pas...



Ok

Mais la fonction touch($fichier) est censée vérifier que le
fichier/dossier a le même uid/gid que celui du script qui l'exécute.

...Alors que sur le site du PHP Manual, il y a des commentaires de
développeurs Américains, disant qu'il est possible de créer un fichier
sur un répertoire courant de uid/gid différent de celui du script, en
faisant:

@touch($fichier); // Cela crée le fichier de longueur zéro,
// et de uid/gid == celui du script,
// pas d'erreur d'après les développeurs
// Américains.

if(!($fp = @fopen($fichier, "w"))) // Possible, car l'uid/gid
{ // Message d'erreur... // du fichier $fichier
die(""); // est le même que celui
} // du script.

// traitement en écriture sur le fichier

@close($fichier); // idem.


Par ailleurs la documentation du site http://www.nexen.net que tu
indiques, spécifie bien que c'est une liste "non exhaustive", donc il se
peut qu'il y ait d'autres fonctions que celles-ci, désactivées par le
safe mode...

Comme je l'ai dit au début, je n'ai pas la possibilité de vérifier si
ça marche en réel, car mon abonnement ( encore un an ) mutualisé 240Plan
chez OVH, est en SuExec, avec Safe Mode à 'Off'.

Je fais ces recherches, car l'hébergeur que je souhaite avoir, Sivit,
a effectivement le Safe Mode à 'On', et PHP fontionne comme module, et
non pas en SuExec. Je ne peux pas tester en réel sans savoir si ça va
fonctionner, car mon site fournit des pronostics quotidiennement au site
www.lescourses.com. Je ne peux pas tester l'hébergement Sivit tout en
gardant mon hébergement OVH actuel, d'abord car cela ferait des
'duplicate content' vis-à-vis du moteur de recherche Google, et je me
retrouverais blacklisté sans avoir le temps de dire Ouf.

Je ne peux pas non plus tester sur ma machine en local chez moi, car
je n'ai qu'un seul ordinateur, et le Safe Mode est considéré comme
inopérant, quand l'adresse ip du client est la même que celle du
serveur, ou que la machine est la même.

Merci beaucoup de m'indiquer si tu peux me donner d'autres liens
donnant les fonctions désactivées par le Safe Mode.

Et également merci de me dire si la fonction touch($fichier)
fonctionne quand même, quand le Safe Mode est à 'On'.

Bien à toi.

Amicalement.

Jean-François Ortolo

--
Visitez mon site gratuit donnant des Statistiques
et des Historiques Graphiques sur les Courses de Chevaux:
http://www.ortolojf-courses.com