exec('java JavaProgram 引数 引数 ・・・');
コマンド・インジェクションを防ぐ必要がありますが、PHPのWEBページからのユーザの入力値をJAVA側で何の欠落もなく受け取りたいんです。
入力値をPHP側で何らかのエンコード方式を使用してサニタイズした引数を作成し、JAVA側でデコードする形を想像しているのですが、シェルの引数の受け渡しとして無害な良い方法はありますか。
シェルの引数の受け渡しとして無害な良い方法はありますか
#1さんも答えているように、そういう方法はありません。
ただ、「PHPのWEBページからのユーザの入力値をJAVA側で何の欠落もなく受け取りたい」というのが第一の目的なら、PHP側で徹底的に入力チェックを行い、Javaに渡すのがいいでしょう。
これは一般論ですが、最低限、PHP側で以下のような入力パラメタ検査を行います。
パラメタ検査の手順ありがとうございます。
ただ、データの内容の精査よりもむしろJAVA側へデータをいかに加工せずに渡すかに重きを置いていまして。。
質問の意図をはずしていたら、すみません。
PHPスクリプトもJavaプログラムも多少の修正が可能という前提ですが、無害な方法として、こんなのはどうでしょう?少なくとも、コマンド・インジェクションは防げます。
PHP側
リクエストパラメタをファイルに格納する
格納したファイル名を引数として、Javaプログラムを起動
Java側
受け取ったファイル名を元にファイルを読み込みパースする
PHPスクリプトからexec関数で呼び出す際のパラメタは、ユーザの入力からは無縁となりますので、別コマンドの起動などを考慮する必要はありません。
データの内容にもよりますが、Propertyファイルとかであれば、PHP側からも容易に書き出せますし、Java側でも読み込みが簡単でいいかなと思います。
もちろん、XMLなどできっちりスキーマを定義するのもよいかもしれませんが。
何かの参考になれば。
hogehoge.propertiesのことですね。実際に試してみました。
日本語等もURLエンコードすれば無害のようですし(エンコード必要なし?)、記述方法がURLのクエリーと似ているので、JAVA、PHPの両方でコードが簡単でいいですね。
プログラムの実行後phpに処理が戻らなくてもいいのなら、 pcntl_exec()を使う方法もあります。
これは引数をコマンドラインに展開せず全て配列で渡すので原理的にコマンドインジェクションが起こりえません。
javaのプログラムも自作なら、全ての引数をBASE64エンコードして渡すとかもアリかと思います。
pcntl_execの存在は気づきませんでしたが、環境変数経由でパラメータを渡すということでしょうかね。ただ、プログラムにて標準出力に吐いたデータを再度PHPで処理しようと考えていました。
BASE64・・・漠然とこれをイメージしていましたが、無害なのでしょうか。じっくりとチェックしてみようかと思います。
やっぱりないのでしょうか。