してここではコマンド注入攻撃とSQL注入攻撃について述べる。実装時出力先に応じて特殊な意味を持つ記号などに対策を行うことは「注入対策」全般に共通する。方式設計の段階で考慮すべき対策もある。注入攻撃はコマンドやSQL以外にも出力先毎にある。injection)」は、Webアプリケーションプログラムがシェルコマンド文字列を組み立てて実行している箇所がある場合、そこに外部からデータに紛れさせたコマンド文字列を送り込まれると、コンピュータを不正に操られてしまう問題である。Command(日本語訳)注:シェルコマンド(すなわちOSコマンド)以外にも問題となるコマンドがあるので後述する。Codeコマンド注入に伴って想定される被害コマンド注入を行う攻撃への対処が不十分であると、コンピュータの乗っ取り、他のコンピュータへの攻撃の踏み台、コンピュータウイルスのばらまき、フィッシング詐欺等の悪用が起こり得る。コマンド注入攻撃のメカニズムコマンド注入攻撃は、外部から取り込んだデータをコマンド文字列の一部に組み入れて、それをシェルに実行させる場面が狙われる。コマンド注入攻撃のメカニズム例えば、次はsendmailコマンドを利用してメールを発信する例である。次のような文字列を与えて、サーバ運用者の意図に反したコマンドの実行を行わせることができる。うっかりシェルを動かさない自分ではそのつもりが無くても、プログラマがシェルを起動するAPIを気づかぬうちに使っていることがありうる。使い方によっては、シェルを起動してコマンドを解釈させることになるAPIがあることを認識し、できればそれらのAPIを使わないようにする。qx/.../なるべく使わない。"{command}|")なるべく使わない。open()の代わりにsysopen()を使う。system()なるべく使わない。os.popen()なるべく使わない。`...`なるべく使わない。いずれかが含まれているとシェルが起動される。perm)open()はなるべく使わない。open()を使うのであれば、ファイル名引数(第1引数)に記号「|」が含まれないようにする。別プログラムの起動を避ける可能であれば、ソフトウェア構成を設計する際に(方式設計において)、別のプログラムを呼び出すことを避けた設計を行う。クラスライブラリやランタイムライブラリで解決できる場面で別プログラムを用いない。シェルが用いられないAPIを選ぶ別のプログラムを起動せざるを得ない場合、内部でシェルが呼び出されないAPIを選ぶことが望ましい。C言語においては、execve等のexec系関数が、JavaではRuntimeクラスのexecメソッドがそれにあたる。Perlには、シェルを動作させずに他のプログラムを呼び出せるAPIが備わっていない。PHPには、プロセス制御関数群(PCNTL)の中にはpcntl_execというライブラリ関数が用意されている。これはまさにPOSIXのexec系関数を呼び出すものであるが、逆に現在のプロセス空間に別のプログラムをロードしてしまうため、場合によってはWebサーバプロセスの動作に大きな支障が出ることも考えられ、PHPのpcntl_execのWebアプリケーションにおける使用は推奨されていない。別のプログラムに与えるパラメータに用いる文字種を英数字のみ等安全なものに限定し、検査してから渡す。bashの場合、次の特殊記号は別コマンドの実行に使われるものとして特に警戒する。「;」「|」「&」「`」「(」「)」。次の特殊記号もファイルへのアクセスが起こったりコマンドの意味が変わり得るので警戒する。環境変数のリセット別のプログラムを呼び出す際の環境変数領域は呼び出し側プログラムによって初期化したものを与える。特殊な動作環境chroot等による制約を課す可能ならば、別のプログラムを起動する際は起動されるプログラムがアクセス可能なファイルシステム領域をchrootによって限定する。呼び出し側プログラムはchroot使用に必要となるroot権限を行使しだい速やかに放棄する。シェル以外のコマンド注入対策スクリプト実行関数を避けるスクリプト言語にはシェルの起動と類似のAPIが存在する場合がある。eval()関数がある。eval()関数を利用する例である。「1;悪意のPerlスクリプト」のような値が与えられると、eval()関数によって悪意のスクリプトが実行されることになる。したがって、eval()関数は安易に多用しないほうがよい。使用せざるを得ない場合は、eval()に与える引数に対し厳しい検査を行う。関数はシェルを呼び出しておらず、この問題は解消されている。