file3また、ダブルクォート「"」で囲んだ場合もコマンド置換は有効である。file3コマンド置換をしたくないのであれば、シングルクォート「'」で囲めば、シングルクォート「'」を除いた部分が引数に渡される。コマンドは実行されない。コマンド注入攻撃対策コマンド注入攻撃への対策は、可能ならシェルの使用を避けること、シェルを使用するのであれば、シェルコマンド文字列に組み入れる値に十分な検査を施すことである。関数はその内部でシェルを起動する。複雑なシェルコマンド文字列を処理させる必要がなく、単純にプログラムを起動することが目的である場合、これら2つの関数を使用しないのが無難である。外部からのシェルコマンドへの干渉の問題を避けることができる。代わりに、exec系の関数を用いるのがよい。exec系の関数は、新たなプログラムを起動するためのAPIであり、次のような複数の関数がある。後ろにつく英字が次のような意味をもっている。関数の引数に直接並べる。与えるこれらのうち使用を推奨するのは、execleexecveexecvPの3つである。改ざんされていても影響を受けず、起動するプログラムに与える環境変数を制御できるからである。害をなす特殊記号の侵入をより効果的に防ぐためには、コマンド文字列に埋め込む入力パラメータには英字と数字しか許さない等、用途に応じた文字種検査を行うのがよい。3つは他の記号の意味を無くす「エスケープ機能」をもつが、これらを攻撃への対策として用いるのは得策ではない。エスケープの裏をかく攻撃法が存在することが多いからである。「'...'」というように囲まれているとおぼしき場所に対しては、攻撃者も「'」を入力することによりエスケープの効果から脱出することができる。意味をもつ記号それぞれの直前に「\」を挿入することよって特殊記号の意味をなくそうとしても、UTF-8やシフトJIS等、マルチバイト文字が使われている環境では攻撃者がそれらの「\」を中和できる場合がある。効果を奪うことができる。次のようなバイト列はエスケープ後も問題を起こし得る。系のAPIを使用する。やむを得ずシェルを使用する場合、組み立てるシェルコマンド文字列に組み入れる入力パラメータ値を厳重に検査する。シェルにおいてはすべての特殊記号が何らかの機能をもつからである。