Bagaimana cara cache formulir dengan proxy terbalik dan berurusan dengan token formulir basi?

8

Ketika Formulir API menghasilkan formulir, itu juga menghasilkan token yang dibagikan dengan formulir di bidang tersembunyi, dan diharapkan akan dikembalikan kembali. Jika ya, formulir diproses.

Jika bentuk yang diberikan di mana akan di-cache, katakanlah, oleh Varnish , mekanisme ini rusak. Pengguna pertama yang mengirimkan formulir akan menggunakan token, dan upaya berikut untuk menggunakan formulir akan ditolak.

Strategi apa yang tersedia untuk membuat form tetap berfungsi saat menyimpan form yang diberikan?

Pelajaran
sumber
Apa kau yakin tentang ini? Saya telah membangun situs dengan formulir dan membalikkan proxy dan tidak melihat masalah. Satu-satunya hal yang harus Anda perhatikan, secara umum, adalah memastikan halaman hasil tidak di-cache.
Alfred Armstrong
Saya ingin terbukti salah, karena itu akan menyelesaikan masalah saya, tapi ya, saya yakin. :) Periksa fungsi form_ {g, s} et_cache untuk detailnya.
Letharion
Untuk pengguna anonim, saya yakin bahwa halaman dengan formulir dapat di-cache dengan aman. Untuk pengguna non-anonim, proksi terbalik bermasalah dalam hal apa pun.
Alfred Armstrong
2
(Token hanya dihasilkan ketika pengguna memiliki ID.)
Alfred Armstrong
1
Ah, itu masuk akal. Sayangnya pengguna saya dalam hal ini diautentikasi. Mungkin pertanyaannya harus ditulis ulang untuk memasukkan itu.
Letharion

Jawaban:

5

Saya menggunakan BOA untuk situs saya, tetapi secara default BOA hanya menonaktifkan caching front end dengan cepat untuk pengiriman formulir. Di luar pengalaman saya yang sebenarnya, saya menemukan sebuah salib artifisial berumur satu tahun tentang bagaimana New Zealand Post menangani Drupal & Varnish dan masalah token formulir. Suci John Wayne, itu harus dibaca untuk caching Drupal - sebenarnya. Berfokus hanya pada formulir masalah:

Bagian terakhir dari puzzle kami adalah modul Advanced Cache Bypass Advanced , yang secara otomatis menetapkan cookie NO_CACHE khusus setiap kali pengguna mengirimkan formulir POST di situs, termasuk hal-hal seperti formulir login. Pernis kami dikonfigurasikan untuk mem-bypass cache halaman (tetapi bukan cache ESI) ketika melihat cookie ini.

Anda juga dapat menonaktifkan token formulir ketika produksi XSRF tidak diminta kembali di form_alter (tidak disetel ($ form ['# token']);) atau ($ form ['# token'] = FALSE;)

Sebuah Acquia Drupal kinerja Artikel menempatkan sebagainya sebuah Drupal Modul Authcache , tapi membaca doc pada Authcache, ia bekerja keluar caching dengan tempat dudukan untuk bentuk (tidak caching formulir):

Authcache mencoba untuk mencegat konten yang dikustomisasi dan mengatur placeholder dalam HTML. Kemudian setelah halaman dimuat, panggilan balik Ajax digunakan untuk mengambil data khusus dan mengisi placeholder, secara dinamis memperbarui halaman HTML.

Placeholder Authcache saat ini: Token formulir (hanya pengguna yang masuk; diperlukan oleh> Drupal untuk mencegah serangan pemalsuan permintaan lintas situs)

Strateginya adalah, cache semuanya kecuali form . Jadi menangani semua hal lain: Mungkin Varnish tidak digunakan sama sekali, Memcache & Redis? Strategi saya adalah menggunakan apa yang ditawarkan BOA karena saya menggunakan BOA dan para penyihir di belakangnya ( omega8.cc ) tahu satu ton lebih banyak daripada saya. Saya tidak berpikir ada cache eksternal yang menyelesaikan masalah. Mereka semua tampaknya memotong formulir.

Lakukan caching parsial dengan authcache yang disebutkan di atas dan dengan Tampilan dan Panel yang diubah dengan halus seperti yang disebutkan dalam artikel NZ Post dan dijelaskan oleh kepercayaan otak di Wunderkraut - yang lama, tetapi membahas masalahnya.

Gunakan Drupal ESI Module dan Varnish yang sebagian sesuai dengan ESI):

ESI - atau Edge Side Include - adalah solusi caching kinerja tinggi untuk pengguna yang diotentikasi tetapi juga dapat bermanfaat bagi pengguna Anonim.

Biasanya, halaman yang dipersonalisasi untuk pengguna yang diautentikasi (bahkan personalisasi kecil, seperti blok yang mengatakan "Masuk sebagai manarth") akan mencegah proksi terbalik (yang dapat dengan mudah melakukan 100 kali lebih cepat daripada Drupal) dari caching halaman, karena pesan dimaksudkan untuk satu pengguna kemudian dapat dilihat oleh yang lain.

Semoga itu lebih bermanfaat.

Tom
sumber
Melihat sekilas kode menunjukkan modul ESI tidak melakukan apa-apa sehubungan dengan validasi formulir; tidak menyebutkan penanganan token, atau perubahan bentuk yang menarik. Apakah mungkin Anda hanya belum menembolok bentuk apa pun yang memerlukan otentikasi dalam pernis, dan itulah mengapa Anda belum pernah melihat masalah ini?
Letharion
Ternyata itulah yang sebenarnya terjadi, BOA mem-bypass cache ujung depan dengan cepat untuk formulir (maaf untuk jawaban saya yang sebelumnya tidak lengkap / salah). ESI masih merupakan bagian penting dari strategi "cache semuanya kecuali" sekarang dalam jawaban saya bahkan jika itu tidak langsung menyelesaikannya.
Tom
Artikel postingan NZ itu memang sangat menarik. Namun, seperti yang saya tahu, itu hanya mengatasi masalah token dengan: "Dalam kasus di mana Anda yakin bahwa perlindungan XSRF tidak penting ... Drupal menyediakan mekanisme untuk menonaktifkan token formulir", yang tidak membantu dalam kasus saya.
Letharion
Banyak informasi berguna, dan pasti orang lain akan dapat menerapkannya pada masalah mereka. +1, dan karena itu tinggal satu jam lagi, saya bisa juga menyadari karunia itu juga. :)
Letharion
0

Salah satu solusi potensial adalah dengan menonaktifkan token bersama-sama dengan $form[‘#token’] = FALSE;, kemudian menimpa ajukan panggil balik ke alih-alih benar-benar memposting komentar, buat kembali formulir asli dengan token, dan minta pengguna untuk mengonfirmasi kiriman.

Jika pengguna mendukung ECMAScript , seseorang dapat meningkatkan pengalaman pengguna dengan memiliki sumber daya layanan yang memaparkan pembuatan token formulir baru dan memasukkan formulir yang relevan ke dalam form_cache. Kemudian, segera setelah pengguna berfokus pada formulir, dan dengan demikian cenderung ingin mengirimkannya, nonaktifkan tombol kirim, ambil token baru dan masukkan ke dalam formulir yang sudah diberikan, dan aktifkan kembali tombol kirim.

Pelajaran
sumber