2012-05-08 8 views
5

私はあなたが記事を投稿できるウェブサイトをプログラミングしています。これは、次のjQueryのAjaxで動作します:PHPタイマーは2秒ごとにユーザー入力のみを許可します

$.ajax({ 
     type: 'POST', 
     url: 'action/post.php', 
     data: 'posttext='+posttext+'&imageurl='+imageurl, 
     success: function(feedback){ 
      $('#feedback').val(feedback); 
     } 
    }); 

は、今私は疑問に思う:誰でもサイトに何かを投稿し、何度も何度もこれを行うには、彼自身のAJAXを書くことができます。これをどうやって防ぐのですか?私はpost.phpで何らかのセキュリティチェックが必要であると確信しています - すでにhttpのrefererについて聞いていますが、それは本当に信頼できるものではないように修正することができます。

また、post.phpに同じIPアドレスの投稿がx秒ごとに1回しか投稿されないことを確認するタイマーを追加したいと思います。投稿がx秒未満で送信された場合はタイマーをリセットしますスタックオーバーフローのようなものはコメントでそれを行います)。

誰もがどのようにタイマーを設定し、どのようにajaxを安全に知っていますか?または投稿メカニズムをどのようにして保護するか他のアイデア?

ありがとうございました!

デニス

+0

唯一の方法は、ユーザーの一意の識別子を作成し、サーバー側でこれをチェックすることです。 DB内のデータに依存して、PHPでのコードが良好であるかのように、混乱することはありません。 ajaxのすべてがUXのためだけです –

+0

詳細を教えてください。 UX? – weltschmerz

+0

UX =ユーザーエクスペリエンス –

答えて

1

あなたの最善の方法は、あなたの情報をデータベースに保存することです。

投稿時に、現在のIPアドレスのエントリがDBに存在するかどうかを確認します。そうであれば、エントリの提出日を現在の日付と比較し、しきい値を超えている場合は提出を許可します。それ以外の場合は、エラーメッセージを発行してユーザーをリダイレクトします。

しかし、IPアドレスを詐称することや、ユーザーがプロキシの背後に隠れる可能性があるため、これはまだ絶対に行われません。

+1

あなたのユーザーが大学の寮のすべてで、1つのIPアドレスの背後にNATされている場合、同時に2人の投稿をブロックすることにも注意してください。 –

+0

私はipとuser agentの組み合わせを使うことができます - それはうまくいくのでしょうか? – weltschmerz

+0

@DMoses良い点。 OPは具体的にIPアドレスを記載しましたが、これを解決するにはメールアドレスを要求するか、本格的なユーザーログインを行うこともできます。大きな爪の大きなハンマー。 –

1

ログファイルにIPと要求時刻を格納するだけです。次に、各IPアドレスの存在をログファイルで確認し、格納されている時間を比較します。

ここでは、わずか10秒後に同じIPからのリクエストを許可する簡単なスクリプトは次のとおりです。

$waitSeconds = 10; 
if (allowRequest($waitSeconds)) { 
    // allowed 
    echo "Welcome."; 
} else { 
    // not allowed 
    echo "Please wait at least $waitSeconds after your last request."; 
} 
echo '<hr /><a href="#" onclick="location.reload(true);return false">try again</a>'; 

function getLastRequestTimeDiff($ip = null, $logFile = null) 
{ 
    if ($ip === null) { 
     // no specific ip provided, grab vom $_SERVER array 
     $ip = $_SERVER["REMOTE_ADDR"]; 
    } 
    if ($logFile === null) { 
     // no specific log file taken 
     $logFile = "./lookup.log"; 
    } 
    if (!is_file($logFile)) { 
     // touch 
     file_put_contents($logFile, serialize(array())); 
    } 
    // read content 
    $logContent = file_get_contents($logFile); 
    // unserialize, check manual 
    $lookup = unserialize($logContent); 
    // default diff (f.e. for first request) 
    $diff = 0; 
    // current timestamp 
    $now = time(); 
    if (array_key_exists($ip, $lookup)) { 
     // we know the ip, retrieve the timestamp and calculate the diff 
     $diff = $now - $lookup[$ip]; 
    } 
    // set the new request time 
    $lookup[$ip] = $now; 
    // serialize the content 
    $logContent = serialize($lookup); 
    // and write it back to our log file 
    file_put_contents($logFile, $logContent); 
    // return diff (in seconds) 
    return $diff; 
} 

// encapsulate our function in a more simple function (allow yes/no) 
function allowRequest($allowed = 10, $ip = null, $logFile = null) 
{ 
    $timeDiff = getLastRequestTimeDiff($ip, $logFile); 
    return $timeDiff >= $allowed; 
} 
+0

すごい機能!ありがとうございました! – weltschmerz

関連する問題