taka-123 / VeggieShop

0 stars 0 forks source link

CSRF対策 #7

Open taka-123 opened 4 years ago

taka-123 commented 4 years ago

CSRF脆弱性が認められる為、その対策を行う。

  1. POST投稿を行うフォームにトークンを埋め込み&セッションにも保存

  2. 実際に送られたトークンと、セッションに保存しておいたトークンを照合

  3. 照合で一致した場合、操作を行い、操作が終わった段階でトークンを破棄

taka-123 commented 4 years ago

<4/16昼ごろに考えていたこと>

スクリーンショット 2020-04-16 22 59 16

スクリーンショット 2020-04-16 23 00 05

<4/14夜> これがうまくできたとして、 POSTデータを受けての操作終了後に、セッションを消す処理も必要になる。

教科書には、

最後に重要なのが、POST投稿を受け取って操作を行ったらすぐに現在のトークンを破棄し、新たなトークンを生成することです。

となっていたが、使用案①が上手くいくなら、毎回新たなトークンが生成される(?) =セッションの破棄だけで良い(?)

※② × get_post_data → ◎ get_post

taka-123 commented 4 years ago

ユーザ定義関数、get_csrf_token() と is_valid_csrf_token($token) を、www > model > functions.php ディレクトリに追記する。

「method」で検索して、 各POSTフォームの中に、hiddenとget_csrf_token()を使って、

  1. フォーム送信時に、トークンも送り、且つセッションにも保存するよう追記。

PHPで、POST送信のデータを受けて操作している箇所について、 is_valid_csrf_token($token)を使って、

  1. 正しく送信されている場合に限り、操作するように追記。
  2. また、操作後、セッションのトークンを削除するように追記。

2の箇所の検索の仕方と、追記の仕方を検討中。

taka-123 commented 4 years ago

@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('不正な操作です。');   }   と追記

primestyleus commented 4 years ago

@taka-123 いい感じですね!"セッションのトークンをリセット"については、VIEWが表示されたタイミングで新たなトークンが発行されるので、あえてしなくても大丈夫かと思います。 get_csrf_token()の呼び出しは、コントローラで実行して変数に設定しておくと、viewでは変数をprintするだけとなるので、さらにきれいになります。(formが複数箇所あるページでは、この方法にしないと、formごとに別のtokenが生成されてしまうため、正常に動作しなくなります) では、実装も進めていただいて大丈夫です!

taka-123 commented 4 years ago

@primestyleus index index_view index_add_cart

コードを書いてみたのですが、 http://ccg-textbook.codecamp.jp/4094_practice_csrf.html 教科書の通り、localhost:8080/csrf.htmlからアクセスすると商品が追加されてしまいます。

taka-123 commented 4 years ago

@primestyleus あ、すみません! これが、教科書最下部のトークンの導入だけでは防げない攻撃でしょうか?

primestyleus commented 4 years ago

@taka-123 はいその通りです!ですので、対策としては今回のコード内容で大丈夫です。