PHP CHMOD Avec $_POST

Résolu/Fermé
Bilow Messages postés 1022 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 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 - 25 janv. 2011 à 22:40
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 !
A voir également:

4 réponses

vlmath Messages postés 793 Date d'inscription vendredi 20 octobre 2006 Statut Contributeur Dernière intervention 4 septembre 2011 160
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)).
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
4 janv. 2011 à 15:11
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
0
vlmath Messages postés 793 Date d'inscription vendredi 20 octobre 2006 Statut Contributeur Dernière intervention 4 septembre 2011 160
Modifié par vlmath le 4/01/2011 à 17:28
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']);

ou
chmod("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.
0
Bilow Messages postés 1022 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
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 !
0
Bilow Messages postés 1022 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
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.
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
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 :

<?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 !
0
Bilow Messages postés 1022 Date d'inscription samedi 21 août 2010 Statut Membre Dernière intervention 2 août 2015 117
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 ?
0