2017-05-11 5 views
1

Ich verschiebe meine Web-App von CentOS 5 nach CentOS 7, und neue Sicherheitsfunktionen bezüglich des Verzeichnisses/tmp brechen meinen Code. Ich frage mich, wie ich damit umgehen soll.PHP: Weg, um den wahren/tmp Pfad zu bekommen?

Ich habe PHP-Code, der eine LaTeX-Datei erstellt, führt dann Befehle aus, um diese in eine PDF-Datei umzuwandeln, und das dann an den Benutzer mit entsprechenden Kopfzeilen. Hier sind einige der relevanten Codezeilen wie es jetzt steht:

$fileroot = "/tmp/addr".getmypid(); 
ob_start(); 
/* echo all the LaTeX stuff */ 
file_put_contents($fileroot.".tex",ob_get_contents()); 
ob_end_clean(); 
exec("cd /tmp;uplatex -interaction=batchmode --output-directory=/tmp $fileroot", $output, $return); 

Die Einstellungen in /usr/lib/systemd/system/php-fpm.service umfassen PrivateTmp=true, die /tmp innerhalb PHP verursacht Funktion aufruft wirklich sei /tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmp. Huch! Das ist gut für die Sicherheit, aber exec() verwendet den Pfad /tmp wörtlich, so dass es nicht die Datei finden kann, die file_put_contents() gerade erstellt. Die PHP-Funktion gibt einfach /tmp zurück, und ich kann keine Umgebungsvariablen mit diesem Pfad in ihnen finden. Gibt es eine Möglichkeit, diesen Pfad programmgesteuert zu erhalten? Oder muss ich PrivateTmp ausschalten? Oder gibt es einen besseren Weg, um das zu tun, was ich tun muss? Ja, ich könnte meinen eigenen speziellen Ort mit weit offenen Berechtigungen erstellen, aber es scheint, als sollte es sauberer sein, nur das normale temporäre Verzeichnis zu verwenden.

+0

Was bedeutet 'realpath ("/ tmp")' zurückkehren? –

+6

Wenn Sie 'sys_get_temp_dir()' verwenden, sollte es den Pfad bekommen, ohne dass Sie sich um die harte Programmierung kümmern müssen: http://php.net/manual/en/function.sys-get-temp-dir.php –

+1

Wenn sie sagen PHP hat eine Funktion für alles, was sie nicht scherzen. – Havenard

Antwort

0

So wie ich es sehe, gibt es nur zwei Möglichkeiten:

  1. nicht /tmp aber ein anderes Verzeichnis stattdessen verwenden Sie, die Sie in Ihrer Anwendung Config-Datei vordefinieren. Ich habe kürzlich etwas ähnliches gemacht, wo ich /var/run/myapplication Verzeichnis statt /tmp verwendet habe. (Ich musste einen Cron-Job hinzufügen, um es ebenfalls zu säubern.)

  2. Deaktivieren Sie PrivateTmp im php-frm-Dienst. Hier ist eine Möglichkeit, dies zu tun:

    # mkdir /usr/lib/systemd/system/php-fpm.service.d 
    # echo -e "[Service]\nPrivateTmp=no" > /etc/systemd/system/php-fpm.service.d/privatetmp.conf 
    # systemctl daemon-reload 
    # systemctl restart php-fpm 
    
    # systemctl show php-fpm | grep PrivateTmp 
    PrivateTmp=no 
    
+0

Ja, ich denke, das sind die einzigen Optionen, außer jemand anders hat eine Inspiration.Ich bevorzuge Option # 1, da sie die Systemeinstellungen auf ihren Standardwerten behält. Ich habe schon einen Cron-Job, um meine Sachen aus/tmp zu entfernen, also ist es vielleicht keine große Sache, stattdessen meinen eigenen speziellen Spot zu erstellen. Es scheint nur, dass es nicht notwendig sein sollte. – OsakaWebbie

+0

Eine kleine Korrektur in Ihrer Antwort: Ich denke, es sollte 'PrivateTmp = false' sein, nicht' no'. – OsakaWebbie

0

Ich hatte das gleiche Problem (auf CentOS) und fixt es mit den folgenden Schritten.

nano /usr/lib/systemd/system/httpd.service 

Blick in die Datei und PrivateTmp=false zu PrivateTmp=true

systemctl daemon-reload 
service http restart 

Und Sie sind Ready2Go

+0

Sie haben meine Frage nicht sorgfältig gelesen. Meines ist bereits auf "wahr" eingestellt, und genau das verursacht mein Dilemma. Ja, ich könnte es auf "falsch" setzen, aber "wahr" ist besser für die Sicherheit. Plus, die Einstellung, die meinen Code beeinflussen würde, ist für php-fpm, nicht httpd. – OsakaWebbie

Verwandte Themen