2016-04-27 5 views
1

私はチャット(スラック/重要なapi)に統合するWebhookを書いています。php "exec"(webhook - > bashスクリプト)への引数の悪意のある挿入を防ぐ方法

最も簡単な方法は、それを取得し、ランニングは次のようになります迅速なPHPスクリプト、だったします

<?php 
$token = $_POST["token"]; 
$arg = $_POST["text"]; 

$output = exec("./webhook_script.sh {$token} {$arg}"); 

現状では、スクリプトが正常に動作しますが、私は、誰かが悪意を持って行うことができます心配していますhttp POSTのクエリパラメータtext(スクリプト:$arg)には何らかの攻撃があります。

例:http://myserver/webhook.php?token=abc&text=123;rm -rf *

ので$arg123; rm -rfなり、execコマンドが悪意のあるrm -rf *

を実行これは私が精通しています「SQLインジェクション」と性質が似ていますが、私は方法がわからないんだけどbashスクリプトを安全にするために...

引数を何らかの形で引用するか、おそらくregexを使用してスクリプトパラメータをチェックするのは簡単ですか?

+2

これは、本番マシンではひどいアプローチです。ユーザーが提供する引数でexec()を呼び出さなければならない場合は、ブラックリストではなくホワイトリストを適用することをお勧めします。あなたはどのような議論を期待していますか? – Calchas

+0

引数は内部URLです。私はパターンに正規表現を適用することができますか? – vikingsteve

+0

@Calchasか、Webフックに応答してbashスクリプトを起動するより良い方法を提案することができます。 PHPの解決策はすばやく簡単です。以下のマイケルの答えは、それを安全にするための手順を示しています。 – vikingsteve

答えて

5

exec()に渡す前に、各シェル引数にescapeshellarg()を呼び出す必要があります。これは、各引数を一重引用符で囲み、存在する可能性のある一重引用符をエスケープし、そのような攻撃をイライラさせます。

$token = escapeshellarg($_POST["token"]); 
$arg = escapeshellarg($_POST["text"]); 
関連する問題