質問: PHPとシェルについて教えてください。 最近、OSコマンドインジェクションによる情報漏えいが多発しているので、理解しようと思い、調べております。 シェルやPHPについて知識が乏しい素人です。 ワードの誤用や質問の意図が分かり難いなどあるかと思いますが、回答いただけると幸いです。 シェルに関しては、こちらのページで確認し、シェルはカネールとの間に入って色々と作業をしているとの認識でおります。 **■シェルとサーバの関係は?** シェルの役割については、何となく理解しました。 PHPに関しても、サーバー上にあるZned Engineによって処理していると理解しております。 引用ですが、PHP側に関しては、下記のようなイメージで理解しております。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/42558ba0abef73a4982459e28875263f.jpeg) 引用:独習PHP 第2版 ※第2版からの引用ですが、2016年4月9日に新しい第3版が出ています。 上図を参考に私の方でシェルとカーネルを追加しました。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/866a373b87a844614ce16f9731cfbf99.jpeg) **【質問1】** シェルを実行する関数の利用を避けることで、OSコマンドインジェクションの対策になると「IPAの記事」に書いてあるので、Zend Engineとシェルがやり取りをしているのかと考えましたが、私の認識(上図)であっていますか? ※私が作成した図はこちらの「Cacoo」から編集も可能ですので、文章等で回答しにくい場合は、編集していただけると幸いです。 **■使用する関数がシェル経由か調べるには?** 先ほどの「IPAの記事」にはPHPの場合、`exec(), passthru(), proc_open(), shell_exec(), system()`をなるべく使わないとの記述があります。 この関数は、シェル経由するため使わない方がよいとのことかと存じます。 **【質問2】** PHPマニュアルを見てもシェル経由する関数かどうか記載がありません。 どのようにすれば、シェル経由する関数なのか確認することができますか? **【質問3】** そもそも、なぜシェル経由する必要があるのでしょうか? 調べた感じでは、シェル経由する関数とシェル経由しない関数の2種類があるのかと思います。 シェル経由する関数はカネールの機能を利用しないと実現できないために、シェル経由しているということでしょうか? ご存知の方いれば、教えてください。 よろしくお願いいたしますm(__)m
回答: 【質問1】 基本的には、ほとんどの関数はシェルを経由しません(Zend Engineから直接カーネルを呼び出します)。質問2とも重なりますが、シェル経由となるのは他のプログラムを呼び出す機能のうち、さらに一部だけです。 【質問2】PHPのマニュアルでプログラム実行関数としてまとめてあります。あと、バッククオート演算子も仲間に入ります。 【質問3】PHPから外部のプログラムを実行する際に、シェルを介することで「パイプ」や「リダイレクト」などのような出力制御ができるようになったり、「シェルスクリプト」が実行できるようになったりします。逆に言えばこれらを使わずにプログラムを実行するときにはシェル経由の意味はあまりありませんし、ましてや外部プログラムを実行しない時にはまったく関係しません。