1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

sips in PHP mittels exec() nutzen

Dieses Thema im Forum "Unix & Terminal" wurde erstellt von Tekl, 12.09.08.

  1. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Hi,

    ich möchte gerne den Terminal-Befehl 'sips' (Bildprozessor) in PHP nutzen, um z.B. Thumbnails von PDFs zu erstellen. Als Webserver ist bei mir MAMP im Einsatz.

    Ich bekomme immer Fehler 5 zurück, was wohl mangelnde Rechte sind. safe_mode ist schon off, bringt aber nix. sips liegt in /usr/bin.

    Weiß jemand Rat?
     
  2. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Wie schauts mit fopen aus?
    Gruß Pepi
     
  3. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    PHP und PEAR haben eigene Bildbearbeitungsmöglichkeiten. Lokale Binaries per Webserver auszuführen, ist ein Sicherheitsrisiko.
     
  4. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Kann ich damit PDFs und PSDs rendern? Das mit dem Sicherheitsrisiko ist mir egal, da es eh im Intranet läuft.
     
  5. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Wenn Du das willst, frage ich mich, wozu Du sips verwenden möchtest. Meines Wissens kann sips diese Formate nicht erzeugen.

    PEAR kan PDF erzeugen:
    http://pear.php.net/package/File_PDF
     
  6. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    sips kann jpgs aus PDFs und PSD erzeugen, deswegen will ich ja sips verwenden. Ich möchte Thumbnails von diesen Dateien erstellen können.
     
  7. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
  8. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Stimmt, war missverständlich, aber meine erste Frage war so gestellt wie ich's gemeint habe. Was muss ich denn machen, damit sips erlaubt ist? Rechte setzen oder in PHP was konfigurieren?
     
  9. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Ich nehme an, Du nutzt 10.5 Leopard, welcher Apache 2 hat. Dieser kann Binärdateien in "/Library/WebServer/CGI-Executables" ausführen. Das erkennt man in seiner Konfiguration in "/etc/apache2/httpd.conf". Auch erkennt man den Alias, den man angeben muß zur Adressierung.

    Summa summarum: Dateien, die dort abgelegt werden sind über die URL localhost/cgi-bin/dateiname ausführbar.

    Wenn ich bei mir beispielsweise dies aufrufe:
    Code:
    http://localhost/cgi-bin/hello
    Dann sehe ich im Browser: "Hello, World.".

    Weil:
    Code:
    KeyWest:CGI-Executables macmark$ pwd
    /Library/WebServer/CGI-Executables
    KeyWest:CGI-Executables macmark$ ls -al
    total 8
    drwxrwxr-x  3 root     admin  102 Sep 13 21:53 .
    drwxrwxr-x  5 root     admin  170 Apr 26 12:20 ..
    -rwx---r-x  1 macmark  admin   72 Sep 13 21:53 hello
    KeyWest:CGI-Executables macmark$ cat hello
    #!/bin/sh
    echo "Content-type: text/html\r\n\r\n";
    echo "Hello, World.";
    Nachtrag: Mit PHP verhält es sich ähnlich. Auch dort können Dateien nur in bestimmten Verzeichnissen ausgeführt werden.
    Übungsaufgabe: Durchstöbere die PHP-Doku dazu ;)
     
  10. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Vielen Dank für die Tipps. Leider klappt das alles nicht und ich habe nun auch mittlerweile den Grund.

    Irgendwie mag sips es nicht vom httpd gestartet zu werden, es stürzt dann nämlich mit folgendem Crashlog ab. Kann das jemand irgendwie deuten?

    Code:
    Host Name:      OSX-Server
    Date/Time:      2008-09-24 15:18:13.508 +0200
    OS Version:     10.4.11 (Build 8S2169)
    Report Version: 4
    
    Command: sips
    Path:    /usr/bin/sips
    Parent:  httpd [24553]
    
    Version: ??? (???)
    
    PID:    2757
    Thread: Unknown
    
    Link (dyld) error:
    
    Symbol not found: __cg_jpeg_resync_to_restart
      Referenced from: /System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks/ImageIO.framework/Versions/A/ImageIO
      Expected in: /Applications/MAMP/Library/lib/libJPEG.dylib
     
  11. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    So, ich habe die Lösung gefunden. Zum einen muss ich sips mittels sudo aufrufen und zum anderen muss ich mit dem tool 'visudo' die sudoers-Datei um folgendes ergänzen, damit sudo nicht nach einem Passwort fragt:

    %www ALL = NOPASSWD: /usr/bin/sips
     
  12. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Herzlichen Glückwunsch zum Selbstbau einer Super-GAU-Sicherheitslücke: Der normalerweise völlig unprivilegierte Webserver (und alle, die auf der Webseite Code einschleusen) kann nun Rootprozesse starten und das sogar ohne Paßwort. Dann noch ein Bufferoverflow-Bug in sips und Du bist gepwned.

    Warum nicht so?
    http://www.php.net/manual/en/function.system.php
     
  13. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Der Webserver kann ja nur sips ohne Passwort ausführen. Des weiteren werden die Thumbnails nur einmalig generiert und dass dann auch in Intranet, danach wird sips gar nicht mehr ausgeführt. Zudem müsste ein Hacker für die Ausnutzung eines Bufferoverflow-Bugs in sips irgendwie erst mal Bilddateien auf unseren Server einschleusen, da ja keine Upload-Möglichkeit besteht.

    Was meinst du jetzt genau bei system()? Ich nutze momentan exec() und die Parameter werden vorher auf Plausibilität geprüft. Wo hat system() da einen Sicherheitsvorteil?
     
  14. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Der aufgerufene Befehl läuft nicht unter root. Man kann sogar dafür sorgen, daß nur Befehle aus einem bestimmten Verzeichnis aufgerufen werden können:
    http://www.php.net/manual/en/features.safe-mode.php#ini.safe-mode-exec-dir

    Da würde ich eine Kopie von sips reinlegen und dann mit system() oder einem anderen der dort unter "see also" genannten Funktionen aufrufen:
    http://www.php.net/manual/en/function.system.php

    Wenn ein Webserver root-Befehle ausführt, ist das immer ein Problem. Man läßt keine von außen erreichbaren Dienste Dinge unter root tun. Ein passender Bug darin und das System ist Toast.
     
  15. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Aber wenn ich über system() nun wieder ein sudo verwende, ist die Sicherheit doch hin, oder? sips stürzt ohne sudo leider ab, wenn der User www ist.

    Aber vielen Dank für deine Hinweise.
     
  16. pepi

    pepi Cellini

    Dabei seit:
    03.09.05
    Beiträge:
    8.741
    Du könntest Dir testweise noch eine Kopie von sips machen und die mit Eigentümer www im Filesystem an einem anderen Pfad ablegen.
    Gruß Pepi
     
  17. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Hatte ich bereits versucht. Sips scheint Libraries aufzurufen, auf die www keinen Zugriff hat und stürzt dann ab.
     
  18. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Dann gibt es eine noch bessere Lösung: Der Webserver macht gar nichts. Stattdessen Ordneraktion definieren, die bei neuen Dateien Thumbnails erstellt et cetera.
     
  19. Tekl

    Tekl Fairs Vortrefflicher

    Dabei seit:
    01.06.05
    Beiträge:
    4.622
    Interessante Idee. Kann ich einem Ordner eine Ordneraktion zuweisen und sie wird dann auch ausgelöst, wenn ich Dateien in Unterordner kopiere, oder muss dann jeder Ordner die Aktion bekommen? Funktieren Ordneraktionen auch, wenn jemand über eine AFP-Verbindung Dateien in solche Ordner kopiert?

    Wenn das geht wäre das in unserem Fall wirklich ein coole Alternative, zumal du Thumbnails nicht erst über einen Browseraufruf erzeugt werden müssen.
     
  20. MacMark

    MacMark Biesterfelder Renette

    Dabei seit:
    01.01.05
    Beiträge:
    4.709
    Ob Ordneraktionen auch in Unterverzeichnisse schauen, weiß ich nicht. Man könnte aber Ordneraktionen mit "Smart Folders" kombinieren.

    Den Ordneraktionen ist es egal, wer den Inhalt ändert, sollte also auch per AFP gehen.
     

Diese Seite empfehlen