2012-03-21 22 views
1

私のコメントシステムでは、小さなセキュリティバグに気付きました。読み込みに数秒かかると、ユーザーは「投稿」ボタンをクリックするだけで、複数のコメントを1つではなくデータベースに送信することができます。私は単純なJavascript入力無効なものでこれを修正することができましたが、人々はFirebugまたはInspect Elementを使用してこれを簡単に編集できることを思い出しました。ボタンを2回以上押す - PHP

これにはPHPの解決策がありますか?私はかなり新しいので、技術的な言葉を話さないでください。

ありがとうございました。 :)

+0

すでにこれに関するスレッドがあります:http://stackoverflow.com/questions/4614052/how-to-prevent-multiple-form-submission-on-multiple-clicks-in-php – Raf

+0

既に見ましたトピック、残念ながら返信のどれも役立たなかった。 –

答えて

0

最も簡単な解決策は、すべてのデータをセッションに保存することです。このセッションでは、コメントが一意であると判断する必要があります。ユーザーがあなたのウェブサイトにいて、別の訪問者が別のセッションを持つ限り、PHPセッションはアクティブです。つまり、訪問者がボタンを2回クリックしたかどうかを判断するには、a)メッセージとb)投稿(私が想定している)のコメントだけが必要です。

例:あなたが確信している。この方法では

session_start(); 

// This is something you already have, sort-of 
$message = $_POST['message']; // Message from user 
$post = $_GET['id']  // Id of post to which he commented 

if (isset($_SESSION['message'] 
&& isset($_SESSION['id'] 
&& $message === $_SESSION['message'] 
&& $post === $_SESSION['id']) 
{ 
    // We found out the user has already posted this 
    echo 'Error: you clicked twice!'; 
    exit; 
} 

// Process message here as you already do 

// Store now this just posted message in a session 
$_SESSION['message'] = $message; 
$_SESSION['id']  = $post; 

はデータが二回サーバーに固執していないがあります。しかし、依然としてリクエストが行われている限り、phpでそのボタンを無効にすることはできないので、javascriptでそのボタンを無効にする必要があります。

+0

ユーザーが無効になっているボタンを迂回することができれば、セッションIDをリクエストから削除して、セッションが役に立たないことに基づいてすべてのユーザー追跡を行うことができると思います。 – Sirko

+0

ありがとう!完璧に働いた。私は超高速の回答にも驚いています。私は多くのこのサイトを使用するように見えます! –

+0

@Sirko、私はすでにこの問題を、オンラインで見つかった反セッションハイジャックコードで解決しました。 –

0

あなたは最後のコメントの内容と時間を保存するためにセッションを使用できます。私はそれがWordpressがそれをする方法と思う。

だから、あなただけ、のようなコメントと一緒に例えば、ユーザを識別するために何かを記録IPとのは5minsとIPを言うとすることにより、他の提出コメントを破棄してみましょうごとに1つのコメントを許可することができ

session_start() 
$_SESSION 
0

を探しますその間にそのIP。

+0

IpまたはUserはシステムに依存します – safarov

+0

@safarovコメントシステムは最初にアカウントを登録することに拘束されている可能性があります。その場合、コメントのソースを参照するためのUserIdがあります。 Ipは一意のユーザーを特定する簡単な方法ですが、特定のユーザーにはさらに多くの指紋を付けることができます。 – Sirko

1

サーバー側からそのボタンを無効にする方法はありません。クライアントは、要求ごとに新しいスレッドを作成するWebサーバーによって別々に実行される複数の要求を送信しています。ユーザーがすでにコメントを投稿しているかどうかを確認する必要があります。これを行うには、そのスレッドの最後の投稿/その投稿をチェックして、ユーザーがすでに投稿を投稿した場合は、クエリを実行せずに

0

クリック時にボタンを非表示にし、別の偽のボタンを表示させることができます。

+1

これはまだブラウザに依存しています。これは信頼できません。 – jprofitt

関連する問題