5

投稿できるウェブサイトをプログラミングしています。これは、次の jQuery ajax で機能します。

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

今思うのは、誰かが独自の ajax を作成して、サイトに何かを投稿し、これを何度も何度も行うことができるということです。これを防ぐにはどうすればよいですか?post.php である種のセキュリティ チェックが必要になると確信しています。http リファラーについては既に聞いたことがありますが、これは変更できるため、あまり信頼できません。

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

ajaxを保護する方法とタイマーの設定方法を知っている人はいますか? または、投稿メカニズムを保護する他のアイデアはありますか?

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

デニス

4

2 に答える 2

1

最善の方法は、情報をデータベースに保存することです。テーブルには 4 つのフィールドを含めることができます。

ipAddress, submitDate, postText, imageUrl

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

ただし、IP アドレスがスプーフィングされたり、ユーザーがプロキシの背後に隠れたりする可能性があるため、これでも絶対確実というわけではありません。

于 2012-05-08T19:54:17.270 に答える
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;
}
于 2012-05-08T20:10:10.733 に答える