Open taka-123 opened 4 years ago
<4/16昼ごろに考えていたこと>
<4/14夜> これがうまくできたとして、 POSTデータを受けての操作終了後に、セッションを消す処理も必要になる。
教科書には、
最後に重要なのが、POST投稿を受け取って操作を行ったらすぐに現在のトークンを破棄し、新たなトークンを生成することです。
となっていたが、使用案①が上手くいくなら、毎回新たなトークンが生成される(?) =セッションの破棄だけで良い(?)
※② × get_post_data → ◎ get_post
ユーザ定義関数、get_csrf_token() と is_valid_csrf_token($token) を、www > model > functions.php ディレクトリに追記する。
「method」で検索して、 各POSTフォームの中に、hiddenとget_csrf_token()を使って、
PHPで、POST送信のデータを受けて操作している箇所について、 is_valid_csrf_token($token)を使って、
2の箇所の検索の仕方と、追記の仕方を検討中。
@primestyleus 以下の方法を考えてみたのですが、いかがでしょうか? (わかりにくい説明で申し訳ありません。) 悪い点が多数あるかと思いますが、よろしければ一度ご意見をお聞かせください。
<1 案> ●VSCode「method」で検索 各POSTフォーム毎に…
formタグ内に <input type = "hidden" name="token" value=get_csrf_token> と追記
<2, 3 案> ●VSCode「get_post」で検索 各if文毎に…
$〇〇 = get_post('〇〇') $◇◇ = get_post('◇◇') の1番上に
$token = get_post('token') と追記
$〇〇 = get_post('〇〇')と、元のif文(インデント下げる)の間に
if (is_valid_csrf_token($token)) { // セッションのトークンをリセット $token = get_csrf_token() と追記
元のif文終了後に } else { set_error('不正な操作です。'); } と追記
@taka-123 いい感じですね!"セッションのトークンをリセット"については、VIEWが表示されたタイミングで新たなトークンが発行されるので、あえてしなくても大丈夫かと思います。 get_csrf_token()の呼び出しは、コントローラで実行して変数に設定しておくと、viewでは変数をprintするだけとなるので、さらにきれいになります。(formが複数箇所あるページでは、この方法にしないと、formごとに別のtokenが生成されてしまうため、正常に動作しなくなります) では、実装も進めていただいて大丈夫です!
@primestyleus
コードを書いてみたのですが、 http://ccg-textbook.codecamp.jp/4094_practice_csrf.html 教科書の通り、localhost:8080/csrf.htmlからアクセスすると商品が追加されてしまいます。
@primestyleus あ、すみません! これが、教科書最下部のトークンの導入だけでは防げない攻撃でしょうか?
@taka-123 はいその通りです!ですので、対策としては今回のコード内容で大丈夫です。
CSRF脆弱性が認められる為、その対策を行う。
POST投稿を行うフォームにトークンを埋め込み&セッションにも保存
実際に送られたトークンと、セッションに保存しておいたトークンを照合
照合で一致した場合、操作を行い、操作が終わった段階でトークンを破棄