misterunknown: chmod funktioniert nicht richtig

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

  1. 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?

    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"

    1. 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

      1. 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));  
        

        ?>

        1. 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

          1. 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.  
            
            
          2. 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

        2. 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

  2. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. 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