PHP CHMOD Avec $_POST
Résolu/Fermé
Bilow
Messages postés
1014
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
-
4 janv. 2011 à 12:42
Bilow Messages postés 1014 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 - 25 janv. 2011 à 22:40
Bilow Messages postés 1014 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 - 25 janv. 2011 à 22:40
4 réponses
vlmath
Messages postés
794
Date d'inscription
vendredi 20 octobre 2006
Statut
Contributeur
Dernière intervention
4 septembre 2011
160
4 janv. 2011 à 15:00
4 janv. 2011 à 15:00
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)).
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)).
Bilow
Messages postés
1014
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
117
Modifié par Bilow le 5/01/2011 à 13:04
Modifié par Bilow le 5/01/2011 à 13:04
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 !
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 !
Bilow
Messages postés
1014
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
117
Modifié par Bilow le 5/01/2011 à 14:03
Modifié par Bilow le 5/01/2011 à 14:03
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 :
Edit : Je viens de découvrir la fonction decoct(); Je vais un peu regarder.
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.
Bilow
Messages postés
1014
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
117
5 janv. 2011 à 15:00
5 janv. 2011 à 15:00
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 :
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 !
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 !
Bilow
Messages postés
1014
Date d'inscription
samedi 21 août 2010
Statut
Membre
Dernière intervention
2 août 2015
117
25 janv. 2011 à 22:40
25 janv. 2011 à 22:40
Je repasse sur cette discussion un mois plus tard, je relis... Je suis trop content de mon code :D Ces fonctions n'existaient pas avant ?
4 janv. 2011 à 15:11
voir
https://www.php.net/manual/fr/function.chmod.php
Modifié par vlmath le 4/01/2011 à 17:28
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 :
ou
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.