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側で、言語ファイルが存在しないとエラーになると思いますので、そちらはちゃんとインストールしましょう。
0 件のコメント:
コメントを投稿