PHP CHMOD Avec $_POST
Résolu
Bilow
Messages postés
171
Date d'inscription
Statut
Membre
Dernière intervention
-
Bilow Messages postés 171 Date d'inscription Statut Membre Dernière intervention -
Bilow Messages postés 171 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Comment faire pour utiliser le deuxieme parametre de la fonction CHMOD(), avec une chaine (envoyee par formulaire) ?
Exemple :
chmod("fichier", 0777);
chmod("fichier", $_POST['new_chmod']);
Merci !
Comment faire pour utiliser le deuxieme parametre de la fonction CHMOD(), avec une chaine (envoyee par formulaire) ?
Exemple :
chmod("fichier", 0777);
chmod("fichier", $_POST['new_chmod']);
Merci !
4 réponses
-
Salut,
T'as différents fonctions, tel que system(), ou exec() (voir le manuel : http://ch2.php.net/manual/en/function.system.php).
Fait quand même très attention à comment du passe le nom de fichier, ça risque d'être utilisé pour prendre contrôle de ton serveur si tu ne le fais pas correctement (ne fait pas un $_GET['$file'], c'est très mauvais, mais plutôt une liste de fichiers ou dossier qui peuvent être modifiés (avec un switch() par exemple)).-
Naan. system et exec, c'est quand on y est vraiment obligé (exécutable propriétaire p.ex) ou pour les neuneux qui n'ont jamais lu un manuel ou qui viennent de Win$
voir
https://www.php.net/manual/fr/function.chmod.php -
A ouais, parfait, j'avais pas vu. Et le pire c'est que je l'ai déjà utilisé par ftp ... honte à moi ^^
Ben alors il n'y a pas de question, puisque la réponse se trouve dans le premier poste non ?
Ou j'ai loupé quelque chose ... ?
Edit : J'ai compris le problème ... ^^
Le deuxième paramètre est un int.
Tu dois donc caster ta variable en int comme ça :
chmod("fichier", (int)$_POST['new_chmod']);
ouchmod("fichier", intval($_POST['new_chmod']));
J'ai pas essayé. Dis si ça ne va pas.
Par contre, la doc indique qu'une notation en décimale risque d'être correcte. Essaye de voir avec la fonction intval, et de changer la base en base 8.
A voir.
-
-
Salut !
Exec et system sont des fonctions qui sont bannies sur mon hebergeur (one.com).
Ne t'inquiete pas, je ne suis pas con au point de laisser n'importe qui prendre le controle du serveur. Le fichier provient d'une liste prédéfinie, et il faut un mot de passe pour accéder à la page. Et j'ai encore l'une ou l'autre sécurité avant d'arriver à cette ligne.
J'avais déjà pensé a php.net, j'avais déjà vu que le décimal était incorrect. Voila pourquoi je poste un message.
Nous voici maintenant enfin là où on doit etre : le coeur du sujet. Il faut convertir une chaine en nombre, et ensuite en octal. C'est là que je coincais. Je vais maintenant essayer, et je vous direz quoi.
Merci ! -
Je n'y arrives pas...
Pour éxécuter intval($param) en base 8, c'est intval($param, 8).
Donc, j'arrives avec $chaine = $_POST['new_chmod'];
On oublie temporairement les sécurités.
$chaine vaut "775" (il n'y a pas de zéro avant, l'utilisateur est averti). J'en rajoute un : $chaine = "0" . $chaine; Maintenant, $chaine vaut "0775";
J'aurais aussi pu, tout de suite, avoir un nombre : $nombre = (int)$chaine;
Donc, je me retrouve avec $chaine = "0775" et $nombre = 775;
Que faire maintenant ?
Une petite liste de résultats qui peuvent etre intéressants :intval(755, 8) = 755 intval(0755, 8) = 509 intval("755", 8) = 509 intval("0755", 8) = 509
Edit : Je viens de découvrir la fonction decoct(); Je vais un peu regarder. -
C'est bon, j'ai trouvé !
En fait, il faut envoyer, comme prévu, une valeur octale à chmod(); Mais si on lui donne une valeur décimale, ca le convertit !
Il faut donc envoyer une valeur décimale, qui n'a rien à voir avec notre vrai chmod, et chmod() la convertira en octal correct.
Voici donc un code avec des exemples des fonctions setchmod et getchmod que j'ai créées, et qui sont bien pratiques :
<?php function setchmod($file, $int_chmod){ return chmod($file, octdec($int_chmod)); } function getchmod($file){ return (int)substr(sprintf('%o', fileperms($file)), -4); } setchmod("index.php", 775); echo getchmod("index.php"); // Renvoi 775 $chaine = $_POST['new_chmod']; // "777" $nombre = (int)$chaine; // 777 setchmod("fichier", $nombre); echo getchmod("fichier"); // Renvoi 777 (en int) ?>
Observez qu'on envoi une valeur décimale à chmod(); On la converti en "sur"-décimale, puis le chmod s'occupe de la convertir en octale, qui en fait sera décimale, ce qui nous arrange bien.
Au final, on trompe chmod();
C'est un peu dur à comprendre, mais ca fonctionne ! :D
Merci !