2016-10-18 4 views
1

私はローカルウェブサーバとして使用OpenWrtのルータを持っていると私は私の3GモデムにUSSDをダイヤルするWebページを作成し、スクリプトは次のようになります。ローカルWebページでシェルスクリプトの挿入を防ぐには?

<html> 
<title>CHECK USSD</title> 
<body> 
<?php 
if($_POST['send']){ 
    $ussd=$_POST['ussd']; 
    exec('ussd.py '.$ussd,$out); 
    echo "Result: ".$out[0]; 
} 
?> 
<form action="" method="post"> 
USSD :<input type="text" autofocus name="ussd" size="14" value=""> 
<input name="send" type="submit" value="Send Ussd"> 
</form> 
</body> 
</html> 

ussd.pyは、私がチェックするために使用するPythonスクリプトですUSSD。問題は、ユーザが$(echo "hacked" > /www/index.html)または$(rm -fr /root/*)のような入力ボックスに何らかの種類のスクリプトを入力しようとすると、それらのスクリプトも実行されることです。だから、人々は簡単に私のルータをハックすることができます。それをどうやって防ぐことができますか?

+1

http://php.net/manual/en/function.escapeshellarg.php – Devon

+2

ユーザ入力を 'exec'にパイプする前に徹底的に検証する必要があります。正規表現を使用します。近い定義に一致しないものは、入力として受け入れるものを即座に破棄する必要があります。 –

+0

@FranzGleichmann合意し、単に 'escapeshellarg'を使って、あなたが完了したと思っても十分安全ではありません。 – Pete

答えて

0

文字列が単一の引数として扱われるように、探しているコマンドはescapeshellarg()です。

$pattern = '/Some regex that matches your potential inputs/'; 

if (preg_match($pattern, $ussd)) { 
    exec('ussd.py '.escapeshellarg($ussd),$out); 
} else { 
    //throw error/response to user 
} 

一般的に言えば、ユーザー入力から直接実行することは安全とはみなされません。したがって、潜在的な入力コマンドのパターンに対応する正規表現を見つけて、それが前に一致することを確認します(ハードコードされたコマンドはオプションではありません)。

+0

'escapeshellarg($ out)'はおそらくあなたのものではありません – Pete

+0

あなたは 'それで安全な方法は何ですか? – hillz

+0

スクリプトのパラメータに対応する事前定義されたオプションのリストをユーザーに提供します。それに失敗した場合、別のコメントでパターンマッチングのある受け入れられたパラメータの配列が提案されました。 –

関連する問題