megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

PHPでコマンド実行しようとしたら日本語が消失した

PHPでコマンドを実行する時はOSコマンドインジェクション対策としてescapeshellcmdescapeshellargなどでエスケープすることが多いと思うが、その際にマルチバイト文字が含まれているとマルチバイト文字が空文字に変換されてしまって困った。

環境

Service Version
PHP 7.2.2

解決

実行前にロケール情報を設定してあげることで回避できた。

<?php

if (! setlocale(LC_CTYPE, "UTF8", "ja_JP.UTF-8")) {
    throw \Exception('Not exist Locale.');
}

$cmd = escapeshellcmd($cmd);

雑感

そもそもマルチバイトがコマンドに入るような設計がどうなの。