アンチシェイク (デバウンス) は、繰り返しの送信を防ぐための戦略であり、一定期間遅延させることで連続する操作をマージし、操作が 1 回のみ実行されるようにします。
以下に、いくつかの手ぶれ補正実装方法と対応するコード例を示します。
1. フロントエンド JavaScript の実装:
JavaScript を使用してフロントエンドで手ぶれ補正を実装し、 setTimeout
関数を使用して送信操作の実行を遅らせることができます。
function debounce(func, late) { let timer; return function() { clearTimeout(timer); timer = setTimeout(() => { func.apply(this, argument); }, late); }; } const submitForm = debounce(function() { // ここでフォーム送信を実行します}, 1000); // 実行を 1 秒遅らせます
2. バックエンド PHP 実装 (セッションを使用):
バックエンドでセッションを使用すると、繰り返しの送信を防ぐことができます。送信する前にセッションにトークンを保存し、送信後にトークンが一致することを確認します。
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $token = uniqid(); // 一意のトークンを生成 $_SESSION['submit_token'] = $token; // フォーム送信を実行Operation unset($_SESSION['submit_token']); // トークンをクリアする}
3. バックエンド PHP 実装 (トークンを使用):
ページが読み込まれるたびに一意のトークンを生成し、フォームに保存します。フォームが送信されたら、トークンが一致することを確認します。
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $submittedToken = $_POST['token']; $storedToken = $_SESSION['submit_token']; if ($submittedToken === $storedToken) { // フォーム送信操作を実行します unset($_SESSION['submit_token']); // トークンをクリアします } }
上記のコード サンプルは基本的な手ぶれ補正方法であることに注意してください。実際のアプリケーションでは、ビジネス ニーズに基づいて適切な調整や拡張を行う必要がある場合があります。同時に、繰り返しの送信をより効果的に防止するために、フロントエンドとバックエンドの方法を組み合わせてデータのセキュリティを確保することもできます。
PHPアンチシェイク(重複投稿防止)の実装方法とは何ですか?10個紹介します
デバウンスは、繰り返しの送信を防ぐために一般的に使用される方法で、短期間に 1 回の送信操作のみが実行されるようにして、繰り返しの送信によって引き起こされる問題を回避します。ここでは、安定化を実現する 10 の方法を簡単なコード例とともに示します。
1 セッション トークン アンチシェイク:
セッション (セッション) でトークンを使用して、繰り返しの送信を防ぎます。
// ランダムなトークンを生成
$token = md5(uniqid());
// トークンをセッションに保存
$_SESSION['submit_token'] = $token;
// トークンを
echo '<input type=の形式で埋め込みますhidden" name ="submit_token" value="' . $token . '">';
// フォーム送信時の検証処理
if ($_POST['submit_token'] === $_SESSION['submit_token']) { / / フォーム送信の処理 // セッション内のトークンをクリア unset($_SESSION['submit_token']); }
2 トークン アンチシェイク:
ランダムに生成されたトークンを使用して、繰り返しの送信を防ぎます。
$token = md5(uniqid());
echo '<input type="hidden" name="submit_token" value="' . $token . '">';
if ($_POST['submit_token'] === $token) { // 处理表单提交}
3 タイムスタンプ手ぶれ防止:
タイムスタンプを使用して、一定期間内に繰り返し送信されることを防ぎます。
$currentTime = 時間();
$lastSubmitTime = $_SESSION['last_submit_time'] ?? 0;
if ($currentTime - $lastSubmitTime > 5) { // 処理表单提交 $_SESSION['last_submit_time'] = $currentTime; }
4 IP アドレス アンチシェイク:
IP アドレスを使用して、同じ IP が繰り返し送信されるのを防ぎます。
$userIP = $_SERVER['REMOTE_ADDR'];
$lastSubmitIP = $_SESSION['last_submit_ip'] ?? '';
if ($userIP !== $lastSubmitIP) { // フォーム送信を処理 $_SESSION['last_submit_ip'] = $userIP; }
5 Cookie アンチシェイク:
Cookie を使用して、一定期間内に繰り返し送信されるのを防ぎます。
if (!isset($_COOKIE['submit_cookie'])) { // フォームの送信を処理します setcookie('submit_cookie', 'submitted', time() + 60); // 60 秒以内の繰り返しの送信を許可しません}
6 JavaScript アンチシェイク:
JavaScript を使用して送信ボタンのクリック可能な状態を制御し、繰り返しクリックされるのを防ぎます。
<button id="submitBtn" οnclick="submitForm()">送信</button>
<script>
let submitting = false;
function submitForm() { if (!submitting) { submiting = true; // 実行表单提交操作 document.getElementById('submitBtn').disabled = true; } } </script>
7 遅延アンチシェイク:
最後の操作後の一定期間内に、コミット操作が 1 回だけ実行されます。
if (!isset($_SESSION['submit_timer'])) { $_SESSION['submit_timer'] = time(); } if (time() - $_SESSION['submit_timer'] > 10) { // フォームの送信を処理します $_SESSION['submit_timer'] = time(); }
8. データベースの一意性制約:
データベースの一意性制約を使用して、データの繰り返しの挿入を防ぎます。
try { // データを挿入しようとします。挿入が失敗した場合は、例外がスローされます。 // データの重複を防ぐために、データベースに一意のインデックスまたは一意の制約を追加します。 } catch (Exception $e) { // 挿入の失敗を処理します}
9 キャッシュアンチシェイク:
キャッシュシステムを使用して送信ステータスを記録します。
$cacheKey = 'submit_status_' . $userIP;
if (!cache_get($cacheKey)) { // フォームの送信を処理します cache_set($cacheKey, 'submitted', 60); // 60 秒以内の繰り返しの送信を許可しません}
10 検証コード アンチシェイク:
悪意のある反復送信を防ぐために、ユーザーはフォームを送信する際に特定の検証コードを入力する必要があります。
if ($_POST['captcha'] === $_SESSION['captcha_code']) { // フォームの送信を処理します // 同じキャプチャの複数使用を防ぐためにキャプチャをクリアします unset($_SESSION['captcha_code'] ); }
これらのサンプル コードではさまざまな手ぶれ補正方法が示されており、重複送信を防ぐために必要に応じて適切な方法を選択できます。これらのメソッドは、特定のアプリケーション シナリオに応じて適切に調整および最適化する必要がある場合があることに注意してください。