phpからシステム関数で、(シェルではなく)javaに以下のように引数付で実行させたい処理があります。

exec('java JavaProgram 引数 引数 ・・・');
コマンド・インジェクションを防ぐ必要がありますが、PHPのWEBページからのユーザの入力値をJAVA側で何の欠落もなく受け取りたいんです。
入力値をPHP側で何らかのエンコード方式を使用してサニタイズした引数を作成し、JAVA側でデコードする形を想像しているのですが、シェルの引数の受け渡しとして無害な良い方法はありますか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/05/03 13:26:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:ken33jp No.1

回答回数928ベストアンサー獲得回数13

ポイント20pt

>シェルの引数の受け渡しとして無害な良い方法はありますか。

ありません

id:kyoko55

やっぱりないのでしょうか。

2008/04/28 21:57:13
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント20pt

シェルの引数の受け渡しとして無害な良い方法はありますか

#1さんも答えているように、そういう方法はありません。


ただ、「PHPのWEBページからのユーザの入力値をJAVA側で何の欠落もなく受け取りたい」というのが第一の目的なら、PHP側で徹底的に入力チェックを行い、Javaに渡すのがいいでしょう。


これは一般論ですが、最低限、PHP側で以下のような入力パラメタ検査を行います。

  1. 文字セットの制約‥‥たとえば整数の入力なら10進数字以外は受け付けない。サニタイズ処理も、この中で行う。
  2. 長さの確認‥‥たとえば6文字以上13文字以下のパスワードなら、それ以外の長さの文字列は受け付けない。
  3. 値の範囲の確認‥‥数値入力の場合、入力パラメタの定義域を超えた値を受け付けない。
id:kyoko55

パラメタ検査の手順ありがとうございます。

ただ、データの内容の精査よりもむしろJAVA側へデータをいかに加工せずに渡すかに重きを置いていまして。。

2008/04/28 21:57:36
id:t_shiono No.3

回答回数256ベストアンサー獲得回数22

ポイント30pt

質問の意図をはずしていたら、すみません。

PHPスクリプトもJavaプログラムも多少の修正が可能という前提ですが、無害な方法として、こんなのはどうでしょう?少なくとも、コマンド・インジェクションは防げます。

PHP側

リクエストパラメタをファイルに格納する

格納したファイル名を引数として、Javaプログラムを起動

Java側

受け取ったファイル名を元にファイルを読み込みパースする

PHPスクリプトからexec関数で呼び出す際のパラメタは、ユーザの入力からは無縁となりますので、別コマンドの起動などを考慮する必要はありません。

データの内容にもよりますが、Propertyファイルとかであれば、PHP側からも容易に書き出せますし、Java側でも読み込みが簡単でいいかなと思います。

もちろん、XMLなどできっちりスキーマを定義するのもよいかもしれませんが。

何かの参考になれば。

id:kyoko55

hogehoge.propertiesのことですね。実際に試してみました。

日本語等もURLエンコードすれば無害のようですし(エンコード必要なし?)、記述方法がURLのクエリーと似ているので、JAVA、PHPの両方でコードが簡単でいいですね。

2008/04/28 21:56:41
id:iww No.4

回答回数101ベストアンサー獲得回数10

ポイント30pt

プログラムの実行後phpに処理が戻らなくてもいいのなら、 pcntl_exec()を使う方法もあります。

これは引数をコマンドラインに展開せず全て配列で渡すので原理的にコマンドインジェクションが起こりえません。

PHP: pcntl_exec - Manual


javaのプログラムも自作なら、全ての引数をBASE64エンコードして渡すとかもアリかと思います。

id:kyoko55

pcntl_execの存在は気づきませんでしたが、環境変数経由でパラメータを渡すということでしょうかね。ただ、プログラムにて標準出力に吐いたデータを再度PHPで処理しようと考えていました。

BASE64・・・漠然とこれをイメージしていましたが、無害なのでしょうか。じっくりとチェックしてみようかと思います。

2008/04/28 21:48:50

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません