2017-05-11 5 views
1

WebアプリケーションをCentOS 5からCentOS 7に移行しています。/ tmpディレクトリに関する新しいセキュリティ機能が私のコードを壊しています。私はそれをどうやって処理するのがベストかと思っています。PHP:本当の/ tmpパスを取得するには?

私はLaTeXファイルを作成し、それをPDFに変換するコマンドを実行し、適切なヘッダーでユーザーに提供するPHPコードを用意しています。それが今立っているとして、ここでは、コードの関連行の一部です:

$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); 

/usr/lib/systemd/system/php-fpm.serviceの設定はPHP関数内/tmpが本当にへの呼び出しが発生PrivateTmp=trueを含み、 /tmp/systemd-private-6898f2d665d64b998981bc479ddc2306-php-fpm.service-KU8XML/tmpとなります。 Yikes!セキュリティ上問題はありませんが、/tmpパスをそのまま使用するため、file_put_contents()が作成したファイルは見つかりません。 PHP関数sys_get_temp_dir()はちょうど/tmpを返します。そのパスには環境変数はありません。プログラムでそのパスを取得する方法はありますか?または私はPrivateTmpをオフにする必要がありますか?それとも、私がやるべきことをするためのよりよい方法がありますか?はい、私はワイドオープンパーミッションで私自身の特別な場所を作成することができますが、それはちょうど通常の一時ディレクトリを使用するときれいになるはずです。

+0

ready2goですか? –

+6

'sys_get_temp_dir()'を使うと、ハードコーディングを心配することなくパスを取得するはずです:http://php.net/manual/en/function.sys-get-temp-dir.php –

+1

PHPには、冗談ではないすべての機能があります。 – Havenard

答えて

0

私はそれを見る方法、唯一の2つのオプションがあります。

  1. は、アプリケーションの設定ファイルに事前に定義され、代わりに/tmpが、別のディレクトリを使用しないでください。私は/tmpの代わりに/var/run/myapplicationディレクトリを使用して、最近似たようなことをしました。 (私もそれをクリーンアップするためにcronジョブを追加しなければならなかった)

  2. php-frmサービスでPrivateTmpを無効にする。ここでこれを行うための一つの方法です:

    # 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

ええ、私はそれらが唯一の選択肢だと思います、誰かがインスピレーションを持っていない限り。私はシステム設定をデフォルトに保つので、オプション#1を優先します。私はすでに/ tmpから自分のものを掃除するためにcronの仕事をしているので、代わりに自分の特別な場所を作るのは大したことではないでしょう。それは必要ではないように思えます。 – OsakaWebbie

+0

あなたの答えには小さな修正があります:私は 'PrivateTmp = false'でなければならないと思います。 – OsakaWebbie

0

私は(CentOSの上の)同じ問題を持っていたし、次のステップでそれをfixt。

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

ファイルを見て、 PrivateTmp=falsePrivateTmp=true

systemctl daemon-reload 
service http restart 

にそして、あなたは `のrealpath( "/ tmpは")`は何を返すん

+0

あなたは私の質問を慎重に読まなかった。鉱山はすでに「真」に設定されており、それが私のジレンマの原因となっています。はい、私はそれを 'false'に設定することができますが、' true'はセキュリティにとってより良い方法です。さらに、私のコードに影響を与える設定は、httpdではなくphp-fpmのためです。 – OsakaWebbie

関連する問題