前提・実現したいこと
PHPで簡易な投票ページを作っています。
index.phpページ内にフォームと結果のグラフを設置していますが、リロードすると二重送信となり加算されてしまいます。
トークンを使う方法をいろいろ調べていたのですが、初心者のためどのように記述すればよいかわかりません。とりあえず<input>でトークンを入れてみたのですが、このあとソースのどこにどのような記述が必要でしょうか?
よろしくお願いします。
該当のソースコード
<?php session_start(); $toke_byte = openssl_random_pseudo_bytes(16); $csrf_token = bin2hex($toke_byte); $_SESSION['csrf_token'] = $csrf_token; $fileName = "count.txt"; $errMessage = "エラーが発生しました。"; $answer = $_POST['hidden-btn']; clearstatcache(); if(file_exists($fileName)){ $array = unserialize(file_get_contents($fileName)); //var_dump($array); if(!$array){ $data = [0,0,0]; } else { $data = $array; } if($answer == "1"){ $ansResult = $data[0]; $ansResult++; $data[0] = $ansResult; } else if ($answer == "2") { $ansResult = $data[1]; $ansResult++; $data[1] = $ansResult; } else if ($answer == "3") { $ansResult = $data[2]; $ansResult++; $data[2] = $ansResult; } else { } file_put_contents($fileName, serialize($data), LOCK_EX); } else { $result = touch($fileName); if(!$result){ echo $errMessage.' : ファイルの新規作成に失敗しました。'; exit(); } $data = [0,0,0]; if($answer == "1"){ $ansResult = $data[0]; $ansResult++; $data[0] = $ansResult; } else if ($answer == "2") { $ansResult = $data[1]; $ansResult++; $data[1] = $ansResult; } else if ($answer == "3") { $ansResult = $data[2]; $ansResult++; $data[2] = $ansResult; } else { } file_put_contents($fileName, serialize($data), LOCK_EX); } clearstatcache(); ?> <!DOCTYPE html> <html lang="ja"> <body> <button class="question-btn" value="1">賛成</button> <button class="question-btn" value="2">反対</button> <button class="question-btn" value="3">どちらともいえない</button> <form id="question-form" action="index.php" method="post"> <input type="hidden" name="csrf_token" value="<?=$csrf_token?>"> <input type="hidden" id="hidden-btn" name="hidden-btn" value=""> </form> <div id="chart"> <canvas id="myChart" width="200" height="200"></canvas> <p id="noChart">まだ投票がありません。</p> </div> </body> <script> ※以下省略
試したこと
下記サイトを読んでトークンを生成するところまでは理解できたのですが、チェックをどのようにすればよいのかわかりません。
さいきょうの二重サブミット対策
サイトを安全に!PHPでcsrf対策を行う方法【初心者向け】
補足情報(FW/ツールのバージョンなど)
※事情によりデータベースは使用できません。
※社内イントラネット公開で公開します。
※参考にしたサイト:【PHP】phpでDB不要のアンケート機能を作成する
回答2件
あなたの回答
tips
プレビュー