PHPでexecコマンドを実行する時に全角文字列があると実行できない場合の対処方法

2017年10月13日

Linux PHP サーバー テクノロジー

Linuxファイルに全角文字が含まれるファイルやフォルダが存在していた場合、cdコマンドやviコマンドなど、参照する時に全角文字で指定しなければいけませんが、どうやらApache + PHPの環境で、execを使う時、うまく動作できない場合があったので、対処方法を残しておきます。

どんな環境でどういう症状だったのか

環境は、以下の通り。
Debian Linux 8 Apache2 PHP 5.6.9
上記で、日本語ファイル名のファイルやフォルダをexecで参照しようとすると、エラーが返るという事象。

例)

$cmd = "cat あいうえお.txt"; exec($cmd , $output); print_r($output); OSにsshでアクセスして、上記コマンド部分を叩いてみると、正常に動作するのだが、どうやらApacheを通してexec実行すると日本語文字列が正常に受け渡されていないようだ。 もちろん、OS側でもlocaleの設定をしておかないといけないので、設定ができていなければ、下記リンクを参考にしてもらいたい。 UbuntuのCUIで日本語ファイルを使う方法

対処法

とりあえず、Apacheのexecで日本語が正常に動作したやり方は以下の通り vi /etc/apache2/envvars -- # export LANG=C (コメントアウト) export LANG=ja_JP.UTF-8 (追記) 上記の記述で上書き保存する。 ※心配な人は、ファイルをコピーしてバックアップファイルを作ってから作業してください。 $ sudo /etc/init.d/apache2 restart [ ok ] Restarting apache2 (via systemctl): apache2.service. このおまじないで、うまく動作することができました。 CentOS系の場合は、「/etc/sysconfig/httpd」に書き込みをするらしいです。 Apache(httpd)の設定

システム構築のポイント

Linuxシステム内に日本語文字列のファイルが存在するのは、あまりいい環境とは言えませんが、SAMBAサーバーなどにしている場合などは、致し方ない場合があります。 また、PHPでexec関数を使うというのも、脆弱性の観点からあまり望ましくない環境とも言われています。 ただ、こうしたセキュリティ対応をしっかりしないといけないシステムであっても、ちゃんと脆弱性対応処理を行っていれば、全角ファイルだろうが、execコマンドだろうが、使っても問題はありません。 WEBエンジニアの人であれば、こうした脆弱性についての知識は必須なので、心もとない人は以下のサイトのドキュメントを読み込んでみてはいかがでしょうか? IPA 情報セキュリティ 脆弱性対策

追記

この記事を書いた直後にPHPマニュアルサイトを見ていて気がついたんだが、phpint()で表示される「environment」に「LANG=ja_JP.UTF-8」という値があればいいだけだと思い、PHPファイルに以下を記述しただけで上手く行った。 putenv("LANG=ja_JP.UTF-8"); システムの設定ファイルに手を入れなくても、プログラム側で行ったほうがいいかもしれませんね。今回の案件においては。 ただし、OS側で、言語ファイルが存在しないとエラーになると思いますので、そちらはちゃんとインストールしましょう。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。