2011-01-24 10 views
0

攻撃者が(XSS攻撃、SQLインジェクション)を利用できる方法で$ _POSTまたは$ _GETを使用していないことを確認したいと思います。 。私は、このコマンドを使用$ _GETや$ _POSTを使用するすべての行を見つけるには:

egrep "_GET|_POST" -r -i MyFolder > dangerousUse.txt 

をdangerousUse.txtは439行を持っています。このように検索すると:

egrep "\$_GET|\$_POST" -r -i MyFolder > dangerousUse.txt 

dangerousUse.txtに0行があります。このように検索すると:

egrep "_GET\[|_POST\[" -r -i MyFolder > dangerousUse.txt 

dangerousUse.txtには385行があります。私はこれが私が望む数字だと思うが、私は$記号も一致させたい。

私の最初の質問は、なぜ2番目のegrepコマンドが機能しないのですか?空白と

  • mysql_real_escape_string(htmlspecialchars($input))またはmysql_real_escape_string (htmlspecialchars ($input))または他の組み合わせを:

    は、今私は、次のコマンドのいずれかが適用されている場合は、入力が正しい使用されていることを、確信しています。

  • intval($input)
  • isset($input)
  • $input ==または== $input

は、どのように私は$ _POSTや$ _GETは、これらの機能なしで使用されている行だけを、見つけることができますか? dangerousUse.txtの行を削除することもできます。これらの関数は、この行の各$ _POSTまたは$ _GETに適用されます。

編集:

egrep '\$_GET\[|\$_POST\[' -r -i MyFolder > dangerousUse.txt 

作品、答えの最初の部分のためのVGEのおかげ。現在、dangerousUse.txtには385行があります。しかし、第二のものは私のためにもっと重要です。

第二部のために、egrep -vは試合を反転:

egrep '(isset|intval|mysql_real_escape_string\(htmlspecialchars|md5|datum_anpassen)[\w]*\(\$_' -i -v dangerousUse.txt > dangerousUse2.txt 
+0

あなたが「良い」フィルタアウトすることができますが-v(元に戻す)スイッチを使用して、あまりにも、grepのを使って、「dangerousUse.txt」から一致します引用符とエスケープシェル。 – VGE

+0

値が最初に変数に書き込まれた後、後で消されたときにはどうしますか? – poke

+0

http://www.joelonsoftware.com/articles/Wrong.html –

答えて

4

シェル二重引用符は、二重のエスケープが必要です。

Exemple echo "\$"は「$」 を出力します。しかしecho "\\$"は「\ $」

を印刷し、「$」になるラインの正規表現のマーカーの終わりであるとシェル変数の接頭辞です。 次のパターンは、シェルが単一引用符内の変数補間を実行せず、エスケープがないため、最新のは簡単です罰金

egrep "\\\$_GET|\\\$_POST" -r -i MyFolder > dangerousUse.txt 
egrep "[$]_GET|[$]_POST" -r -i MyFolder > dangerousUse.txt 
egrep '\$_GET|\$_POST' -r -i MyFolder > dangerousUse.txt 

に動作します。

あなたが入力した内容をすべて確認する方法は、すべてを実行するsanitized_GETsanitized_POSTの機能を定義することです。

+0

こんにちはVGE、私は 'sanitize_Input'関数を作成することを考えましたが、整数が必要な場合、intvalは' mysql_real_escape_string(htmlspecialchars) ($ input)) '私は文字列に使用する必要があります。私は速くて見やすく、変数はコードのこの時点からintであると思います。ちなみに、GETとPOSTの2つの別々の関数を定義する理由は何ですか? –

+0

それはあなた次第です。これを実装する方法はおそらく数千種類あります。あなたのケースでパフォーマンスが本当に重要かどうかによって異なります。私は何年もphpを使用していません(むしろdjango-pythonの作業を好む)が、現時点では通常$ _REQUESTを使用していたので、別の解決策です。 – VGE

+0

なぜあなたはジャンゴを好きですか? $ _REQUESTには$ _GETや$ _POSTと比較して長所と短所がありますか、それともそれ以外の方法で送信されたデータにアクセスできますか? –

0

あなたの例では\$は、おそらくあなたのシェルによって解釈され、シェルは$で始まる変数を展開するため、アンエスケープ$は、grepに渡されます。単一引用符を使用してみてくださいまたはその代わりに\$をシェルエスケープ:

さらに
egrep '\$_GET|\$_POST' 
egrep "\\\$_GET|\\\$_POST" 

、あなたはそれぞれ、出力に一致するファイルと行番号を-H-nオプションを使用する場合があります。これにより、危険な使用場所を簡単に見つけることができます。あなたの質問をに関連しているので、私はシェルのタグを追加した

egrep -H -n '\$_GET|\$_POST' -r -i MyFolder | egrep -v 'mysql_real_escape_string|intval|isset|<...>' > dangerousUse.txt 
+1

$ _GETが空の文字列で展開されない 'egrep" \\ $ _ GET | \\ $ _ POST "は本当ですか? – VGE

+0

@VGE:そうです、私はすべてのスラッシュで混乱しました。 –

+0

シェルについて誰が言っているのか分かりません。「バックスラッシュは十分ではありません」 – VGE

関連する問題