Làm cách nào để lưu trữ biểu mẫu với proxy ngược và xử lý mã thông báo mẫu cũ?


8

Khi API biểu mẫu tạo một biểu mẫu, nó cũng tạo ra một mã thông báo được phát ra cùng với biểu mẫu trong một trường ẩn và dự kiến ​​sẽ được trả lại. Nếu có, hình thức được xử lý.

Nếu một biểu mẫu được hiển thị ở bất kỳ nơi nào được lưu vào bộ nhớ cache, giả sử, bởi Varnish , cơ chế này sẽ bị hỏng. Người dùng đầu tiên gửi biểu mẫu sẽ sử dụng mã thông báo và những lần thử sử dụng biểu mẫu sau sẽ bị từ chối.

Những chiến lược nào có sẵn để giữ cho các biểu mẫu hoạt động trong khi lưu trữ biểu mẫu được hiển thị của chúng?


Bạn có chắc về điều này? Tôi đã xây dựng các trang web với các hình thức và proxy ngược và không thấy vấn đề gì. Nói chung, điều duy nhất bạn phải xem là đảm bảo các trang kết quả không bị lưu vào bộ nhớ cache.
Alfred Armstrong

Tôi rất muốn được chứng minh là sai, vì điều đó sẽ giải quyết vấn đề của tôi, nhưng vâng, tôi chắc chắn. :) Kiểm tra các hàm form_ {g, s} et_cache để biết chi tiết.
Letharion

Đối với người dùng ẩn danh, tôi chắc chắn rằng một trang có biểu mẫu có thể được lưu trữ an toàn. Đối với người dùng không ẩn danh, proxy ngược là vấn đề trong mọi trường hợp.
Alfred Armstrong

2
(Mã thông báo chỉ được tạo khi người dùng có ID.)
Alfred Armstrong

1
Ah, điều đó có ý nghĩa. Thật không may người dùng của tôi trong trường hợp này được xác thực. Có lẽ câu hỏi nên được đặt lại để bao gồm điều đó.
Letharion

Câu trả lời:


5

Tôi sử dụng BOA cho các trang web của mình, nhưng theo mặc định, BOA chỉ đơn giản là vô hiệu hóa bộ đệm ẩn phía trước khi đang bay để gửi biểu mẫu. Ngoài kinh nghiệm thực tế của tôi, tôi đã gặp một nhân viên một năm tuổi về cách Bưu điện New Zealand đối phó với Drupal & Varnish và vấn đề mã thông báo mẫu. Holy John Wayne, nó phải đọc cho bộ nhớ đệm Drupal - thực sự. Chỉ tập trung vào vấn đề hình thức:

Phần cuối cùng cho câu đố của chúng tôi là mô-đun Cookie Cache Bypass Advanced , tự động đặt cookie NO_CACHE đặc biệt bất cứ khi nào người dùng gửi biểu mẫu POST trên trang web, bao gồm những thứ như biểu mẫu đăng nhập. Varnish của chúng tôi được cấu hình để bỏ qua bộ đệm trang (nhưng không phải bộ đệm ESI) khi thấy cookie này.

Bạn cũng có thể vô hiệu hóa mã thông báo biểu mẫu khi sản xuất XSRF không được yêu cầu trong form_alter (unset ($ form ['# token']);) hoặc ($ form ['# token'] = FALSE;)

Một bài viết về hiệu suất của Dria Drupal đưa ra Authcache Module Authcache , nhưng đọc tài liệu trên Authcache, nó sẽ tìm ra bộ đệm với một trình giữ chỗ cho biểu mẫu (không lưu vào biểu mẫu)

Authcache cố gắng chặn mọi nội dung tùy chỉnh và thiết lập trình giữ chỗ trong HTML. Sau đó, sau khi trang được tải, một cuộc gọi lại Ajax được sử dụng để truy xuất dữ liệu tùy chỉnh và điền vào chỗ dành sẵn, tự động cập nhật HTML trang.

Trình giữ chỗ Authcache hiện tại: Mã thông báo mẫu (chỉ người dùng đã đăng nhập; được yêu cầu bởi> Drupal để ngăn chặn các cuộc tấn công giả mạo yêu cầu chéo trang web)

Chiến lược là, lưu trữ mọi thứ trừ hình thức . Vì vậy, giải quyết mọi thứ khác: Có lẽ Varnish hoàn toàn không được sử dụng, Memcache & Redis? Chiến lược của tôi sẽ là sử dụng những gì BOA cung cấp bởi vì tôi sử dụng BOA và các pháp sư đằng sau nó ( omega8.cc ) biết nhiều hơn tôi. Tôi không nghĩ rằng có một bộ đệm ngoài giải quyết vấn đề. Tất cả họ dường như bỏ qua cho các hình thức.

Thực hiện lưu trữ bộ nhớ cache một phần với authcache đã nói ở trên và với Chế độ xem và Bảng điều chỉnh được tinh chỉnh như được đề cập trong bài viết của New Zealand và được mô tả bởi bộ não tin tưởng tại Wunderkraut - nhưng nó đã giải quyết được vấn đề.

Sử dụng Mô-đun Drupal ESI và Varnish tuân thủ một phần ESI):

ESI - hay Edge Side Bao gồm - là một giải pháp bộ nhớ đệm hiệu suất cao cho người dùng Xác thực nhưng cũng có thể hữu ích cho người dùng Ẩn danh.

Thông thường, các trang được cá nhân hóa cho người dùng được xác thực (ngay cả các cá nhân nhỏ, chẳng hạn như một khối có nội dung "Đã đăng nhập như manarth") sẽ ngăn các proxy ngược (có thể dễ dàng thực hiện nhanh hơn 100 lần so với Drupal) vì lưu các trang dành cho một người dùng sau đó có thể được nhìn thấy bởi một người khác.

Hy vọng rằng hữu ích hơn.


Nhìn nhanh vào mã cho thấy mô-đun ESI hoàn toàn không làm gì liên quan đến xác nhận mẫu; không đề cập đến việc xử lý mã thông báo, cũng không thay đổi hình thức thú vị. Có thể đơn giản là bạn chưa lưu trữ bất kỳ biểu mẫu nào yêu cầu xác thực bằng vecni và đó là lý do tại sao bạn chưa bao giờ thấy vấn đề này?
Letharion

Hóa ra đó chính xác là những gì đang diễn ra, BOA bỏ qua bộ đệm ẩn phía trước cho các biểu mẫu (xin lỗi vì câu trả lời không đầy đủ / sai trước đây của tôi). ESI vẫn là một phần quan trọng của chiến lược "lưu trữ mọi thứ nhưng" trong câu trả lời của tôi ngay cả khi nó không trực tiếp giải quyết.
Tom

Đó là bài viết bài New Zealand thực sự thú vị. Tuy nhiên, như tôi có thể nói, nó chỉ giải quyết vấn đề về mã thông báo với: "Trong trường hợp bạn chắc chắn rằng bảo vệ XSRF không quan trọng ... Drupal cung cấp một cơ chế để vô hiệu hóa mã thông báo biểu mẫu", không hữu ích trong trường hợp của tôi
Letharion

Mặc dù vậy, có rất nhiều thông tin hữu ích và chắc chắn những người khác sẽ có thể áp dụng nó vào các vấn đề của họ. +1 và vì chỉ còn một giờ nữa, tôi cũng có thể nhận ra tiền thưởng. :)
Letharion

0

Một giải pháp tiềm năng sẽ là vô hiệu hóa tất cả mã thông báo cùng với $form[‘#token’] = FALSE;, sau đó ghi đè gửi lại cuộc gọi thay vì thực sự đăng bình luận, tạo lại biểu mẫu gốc bằng mã thông báo và yêu cầu người dùng xác nhận bài đăng.

Nếu người dùng hỗ trợ ECMAScript , người ta có thể cải thiện trải nghiệm người dùng bằng cách có tài nguyên dịch vụ hiển thị tạo mã thông báo biểu mẫu mới và chèn biểu mẫu có liên quan vào form_cache. Sau đó, ngay khi người dùng tập trung vào biểu mẫu và do đó có khả năng muốn gửi nó, vô hiệu hóa nút gửi, tìm nạp mã thông báo mới và chèn nó vào biểu mẫu đã được hiển thị và bật lại nút gửi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.