Rack::MethodOverride
https://github.com/rack/rack/blob/main/lib/rack/method_override.rb
HTTP Methodをmiddlewareで上書きする
経路上のproxyなどで許可されていないmethodがある場合などに利用可能
リクエストボディに上書きしたいメソッド名を入れる
通常の設定
POSTからGET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINKのいずれかに上書きする
逆はできない
オリジナルのmethodはrack.methodoverride.original_methodから取得できる
https://github.com/rack/rack/blob/v3.0.9/lib/rack/constants.rb#L63
私見
PUT, DELETEなどを受け付けるエンドポイントへのアクセスは単純リクエストではないため、通常はCSRFできない
Rack::MethodOverrideが利用されている場合は、POST経由でCSRF可能になる
確認コード(Github)
code:log
❯ bundle exec puma
Puma starting in single mode...
* Puma version: 6.1.0 (ruby 3.2.1-p31) ("The Way Up")
* Min threads: 0
* Max threads: 5
* Environment: development
* PID: 91170
* Listening on http://0.0.0.0:9292
Use Ctrl-C to stop
DELETE # env"REQUEST_METHOD"の値
POST # env"rack.methodoverride.original_method" の値
=> cross originからREQUEST_METHODがDELETEになるリクエストを送信可能
PUT, DELETEであることをCSRF対策としていることはあまりない
大抵は別の機構により対策しているのでこれを入れていることが問題になるケースは稀
Ruby on Railsで使用されているmiddlwareに含まれているが、使用しないのであれば除外しておいて良いはず
#Rack