2016-09-13 6 views
-1

は、私たちがこのこれはクロスサイトフォーム注入の安全なソリューションですか?

<?php 
session_start(); 
$_SESSION['token'] = rand(0, 6000000); 
echo ' 
<form method="post" action="submit.php/?token='.$_SESSION['token'].'"> 
... 
</form> 
'; 
?> 

そしてフォームハンドラsubmit.php

<?php 
if($_GET['token'] == $_SESSION['token']) { 
//form is valid, do stuff 
} else { 
header("Location: index.php"); 
//give the attacker boot 
} 
?> 

のようなフォームは、このフォームは、フォームが第三者にhttp://somesite.com/submit.php?token=non-genuine-numberに要求を提出し実行することにより、偽造できる方法はあります持っている想像してみてウェブサイト? $_SESSIONトークンのデータが生成され、偽装されている可能性がありますが、正しいセッションデータがない場合は、本物のサイトのリンクをクリックして管理者を欺くことを話していません。

+0

6000001チャンスで1、私は思います。 – Blake

+0

@ブレイクどのくらい正確? AFAIKは、ターゲットサイトのサードパーティサイトから$ _SESSIONデータを生成する方法がないため、セッションベースである可能性があると判断したとしても、$ _SESSION ['token']は本物私が言ったように、サイトが空であると思うのは、フォームを編集してセッションのトークンを推測/修正しようとした途中で管理者を中傷した場合です。 –

答えて

0

セキュリティの観点からは、安全であるとはみなされませんでした。

攻撃者は、ユーザーがフォームをダウンロードしたとき(または観察しても)、適切なタイミングで攻撃を開始できます。彼はまた、6000000から選択された数値をヒットする必要があります。エントロピーは〜22.5ビットと思われますが、実際にはそれはさらに小さくなります(rand_bytes()またはrandom_int()とは対照的にrand )またはLinuxで/ dev/urandomから読み込み)。

したがって、実際に悪用するのは簡単ではないかもしれませんが、セキュリティコードレビューではベストプラクティスに反するため、セキュリティコードの見直しには欠陥があります。

編集:

次の2つのシンプルなものやっによって(効果的に正しく同期化トークンパターンを実装する)ソリューションをたくさん改善することができます:

  • random_bytes(のような安全なPRNGを使用する)

  • 増加エントロピーたくさん

トークンをbin2hex(random_bytes(16))のように生成した方がはるかに良いでしょう。

編集2:つべこべため

もう一つ。 URLパラメータはすべての種類の場所に記録されるため、攻撃者がそれを取得する可能性があるため、URLにトークンを送信しないことをお勧めします。ただし、1回限りのトークン(すべてのページ要求で新しいトークンが生成される)では、リスクが多少軽減されます。 OWASPなどで提案されている隠しフォームフィールドを使用する方が良いでしょう。

+0

NASAでないなら誰もおそらく私はフェンスの安全な側にいらっしゃいますか?私の解決策を見て、それを改善する可能性のある方法はありますか?速い方法は、エントロピーを増やすことです。 –

+0

私は悪用するのはおそらく難しいと言っていましたが、そのようなことを悪用する経験はありません。私は、PHPでrand()がどのくらい正確に動作するかをよりよく理解していれば、それは非常に簡単であるかもしれません(あるいはそうではありません)。 実際にこれをより安全にする簡単な修正を提案するために私の答えを編集します。 –

+0

私は、攻撃者が数千から最大6000000リクエストを作成して、そのフォームに適切な機会を与えて強​​制しなければならないと考えているので、赤旗はサーバー上でかなり早く登場する可能性があります。多くの要求と決して正常な方法ではありません。 –

関連する問題