dedlfix: Moment!

Beitrag lesen

Tach!

   # Prüfungen und Fehlerbehandlung
   if (!  file_exists($sourceDirAndFileName) ) {
      trigger_error ( "Eine nicht existierende Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
      return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
   }

   if (!  is_readable($sourceDirAndFileName) ) {
      trigger_error ( "Eine nicht lesbare Datei $sourceDirAndFileName kann nicht kopiert werden." , $errorType );
      return false; # Falls  trigger_error mit E_USER_NOTICE erfolgt.
   }

Die erste der beiden Prüfungen kann man auch weglassen. Eine nicht existierende Datei ist auch nicht lesbar. Lediglich die Fehlermeldung kann dann nicht beide Fälle unterscheiden. Aber muss sie das?

Ebenso kann man die Prüfung des Ziel-Verzeichisses abkürzen.

Wenn man es jedoch genau nimmt, leidet diese Art der Prüfung am TOCTTOU-Problem. Die Prüfung auf die Voraussetzungen und der eigentlich Kopiervorgang finden zeitlich nacheinander statt und theoretisch kann sich dazwischen der Zustand ändern. Wenn man das umgehen möchte, muss man einfach drauflos kopieren und im Nachhinein auf Fehler prüfen. Allerdings überschreibt copy() eventuelle Ziele gnadenlos und unverhinderbar. Es ist für solche Fälle nicht geeignet und man muss das Datei-Handling und -Sperren selbst in die Hand nehmen.

$fileExt = array_pop( exlode('.', $sourceDirAndFileName) ); # Dateinamens"erweiterung"

Strict Standards: Only variables should be passed by reference in ...

array_pop() hätte gern eine Variable und kein On-the-fly-Array übergeben bekommen. Besser:

$fileExt = pathinfo($sourceDirAndFileName, PATHINFO_EXTENSION);

Vielleicht muss auch noch eine Prüfung der Endung auf erlaubte oder verbotene Werte stattfinden. Dateien mit php als Endung will man beispielsweise nicht entgegennehmen und aufrufbar irgendwo ins Web legen.

dedlfix.