人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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


●質問者: kyoko55
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Java PHP Web エンコード コマンド
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● ken33jp
●20ポイント

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

ありません

◎質問者からの返答

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


2 ● pahoo
●20ポイント

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

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


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


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

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

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

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


3 ● t_shiono
●30ポイント

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

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

PHP側

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

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

Java側

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

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

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

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

何かの参考になれば。

◎質問者からの返答

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

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


4 ● いわわ
●30ポイント

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

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

PHP: pcntl_exec - Manual


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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ