chmod funktioniert nicht richtig
misterunknown
- php
1 suit0 misterunknown0 suit
3 MudGuard
Moin,
ich habe ein seltsames Problem mit chmod. Einen Fehler gibt es nicht, aber es werden die falschen Dateirechte gesetzt. Hier mein Code:
if($cmi) {
try {
chmod($_POST["filename"],(int)$chmod);
print '<span class="message">Sucessfully changed file permissions to '.$chmod.'.</span>';
} catch (Exception $e) {
print '<span class="error">There occured an error while changing file permissions to '.$_POST["filename"].'. Error: '.$e->getMessage().'</span>';
}
}
else print '<span class="error">The file permissions could not be set to '.$_POST["chmod"].'. Check syntax.</span>';
Der entsprechende Wert wird per Post übergeben ($_POST["chmod"]
). Vorher bearbeite ich den Wert noch etwas, damit man auch rwxrwxrwx eingeben kann. $chmod
hat am Ende entweder einen Wert in der Form 775, oder $cmi
ist false.
Ich habe schon probiert noch eine Null davor zu setzen (also 0775) oder per decoct($chmod)
umzuformen. Alles bringt keinen Erfolg.
Hier mal ein paar Beispiele:
- 777 wird 411
- 755 wird 363
- 644 wird 204
- 640 wird 200
Nur 000 bleibt 000, was aber keinem etwas bringt. Was mache ich falsch?
Grüße Marco
Hier mal ein paar Beispiele:
- 777 wird 411
- 755 wird 363
- 644 wird 204
- 640 wird 200Nur 000 bleibt 000, was aber keinem etwas bringt. Was mache ich falsch?
http://www.php.net/manual/en/function.chmod.php
BEWARE using quotes around the second parameter...
If you use quotes eg
chmod (file, "0644");
php will not complain but will do an implicit conversion to an int before running chmod. Unfortunately the implicit conversion doesn't take into account the octal string so you end up with an integer version 644, which is 1204 octal
Und du castest explizit nach int obwohl chmod eine Oktalzahl erwartet - dass in der Doku steht, dass das zweite Argument $mode "int" ist möglicherweise falsch - ein paar Zeilen weiter steht
"Note that mode is not automatically assumed to be an octal value"
Moin,
Und du castest explizit nach int obwohl chmod eine Oktalzahl erwartet - dass in der Doku steht, dass das zweite Argument $mode "int" ist möglicherweise falsch - ein paar Zeilen weiter steht
Wie kann ich denn eine Ziffernfolge als Oktalzahl interpretieren lassen? $chmod ist jetzt bei mir quasi "0777". Wie mache ich daraus eine oktale Zahl 0777 und nicht 1411?
Grüße Marco
Wie kann ich denn eine Ziffernfolge als Oktalzahl interpretieren lassen? $chmod ist jetzt bei mir quasi "0777". Wie mache ich daraus eine oktale Zahl 0777 und nicht 1411?
<?php
// quelle string(4)"0777"
// ziel int(511)
$var = "0777";
echo '<pre>';
var\_dump($var);
var\_dump((int)$var);
var\_dump((int)intval($var));
var\_dump((int)octdec($var));
?>
Moin!
<?php
// quelle string(4)"0777"
// ziel int(511)$var = "0777";
echo '<pre>';
var_dump($var);
var_dump((int)$var);
var_dump((int)intval($var));
var_dump((int)octdec($var));
?>
Dran denken:
$var = 0777; // funzt, oktal
$var = 0xff; // funzt, hex.
$var = 0b00001111; // funzt, binär.
http://php.net/manual/en/language.types.integer.php
- Sven Rautenberg
Dran denken:
$var = 0777; // funzt, oktal
$var = 0xff; // funzt, hex.
$var = 0b00001111; // funzt, binär.
>
> <http://php.net/manual/en/language.types.integer.php>
Sicher, du hast übrigens in deiner Liste vergessen dass `$var = 511;`{:.language-php} auch funktioniert - aber gegeben ist ein String "0777", und die Frage ist wie man den String dazu bekommt, int(511) zu sein - und (int)"0777" ist ganz einfach der falsche weg, weil hierbei int(777) rauskommt.
In meiner Liste ist aber eine Variante dabei, die das gewünschte Ergebnis liefert.
Moin,
$var = 0b00001111; // funzt, binär.[/code]
Das ist cool. So kann ich ganz einfach die Interpretation von Buchstaben-Parametern umsetzen ;)
Vielen Dank für die Info.
Grüße Marco
Moin,
<?php
// quelle string(4)"0777"
// ziel int(511)$var = "0777";
echo '<pre>';
var_dump($var);
var_dump((int)$var);
var_dump((int)intval($var));
var_dump((int)octdec($var));
?>
Danke :) Ich habs hingekriegt. Ich stand scheinbar aufm Schlauch^^
Grüße Marco
Hi,
chmod($\_POST["filename"],(int)$chmod);
Der entsprechende Wert wird per Post übergeben (
$_POST["chmod"]
).
Du hast aber schon noch irgendwo eine Überprüfung drin, mit der Du einschränkst, für welche Dateien das gemacht werden kann?
Weil sonst ist Deine Website schnell stillgelegt:
filename mit z.B. index.php füllen, chmod mit 0, und Dein Script damit aufrufen.
cu,
Andreas
Moin,
Du hast aber schon noch irgendwo eine Überprüfung drin, mit der Du einschränkst, für welche Dateien das gemacht werden kann?
Nein. Das ist ein Dateimanager-Skript, welches ich persönlich über .htaccess geschützt habe. Und jeder, der es nutzen will, muss selbst dafür sorgen, dass nur autorisierte Personen das Skript verwenden können, bzw. die chmod-Funktion über das $config
-Array auszuschalten.
Eine Sicherheitsüberprüfung wäre in diesem Sinne auch gar nicht möglich: Woher will ich wissen, welche Dateien auf einem Server wichtig sind und welche nicht? Und selbst wenn ich das weiß, kann es ja sein, dass jemand die Rechte einer solchen Datei ändern will. Vielleicht nicht nach 0, aber vielleicht nach 755.
Grüße Marco