Rails phiên thực hành hiện tại


83

Có ai có mẹo "thực hành tốt nhất" nào cho Rails và phiên không? Loại phiên mặc định cho Rails 3 vẫn là CookieStore, phải không? Tôi đã sử dụng SqlSessionStore một thời gian và nó hoạt động tốt, nhưng tôi có thể rời bỏ nó để ủng hộ CookieStore.

Sử dụng CookieStore để biết thông tin nhạy cảm, ngay cả với thông tin mặn hay được lưu trữ tốt hơn trong DB vẫn không phải là một ý kiến ​​hay?


1
Ngoài ra, những suy nghĩ hiện tại xung quanh việc sử dụng Memcached để lưu trữ phiên là gì?
Lukas

Câu trả lời:


102

Sử dụng cơ sở dữ liệu cho các phiên thay vì mặc định dựa trên cookie, không nên dùng để lưu trữ thông tin bảo mật cao

Tạo bảng phiên với

rake db:sessions:create

Chạy quá trình di chuyển

rake db:migrate

Đảm bảo rằng bạn cũng yêu cầu rails sử dụng ActiveRecord để quản lý các phiên của bạn.

Đường ray 3

config / initializers / session_store.rb:

Rails.application.config.session_store :active_record_store

Đường ray 2

config / environment.rb:

config.action_controller.session_store = :active_record_store

2
Lần gần đây nhất tôi nghe thấy ARstore cho các phiên hoạt động siêu chậm. có ai biết về điểm chuẩn không?
Lukas

4
Nếu bạn theo dõi sự phát triển của bảng phiên và thiết lập công việc để cắt tỉa nó cho phù hợp, bạn sẽ không gặp vấn đề về hiệu suất.
Bill Leeper

3
Điều này có mâu thuẫn với devise không?
David Mauricio

4
Trên đây, Rails 3.2, nó là một cái gì đó giống như TheNameOfMyApplication :: Application.config.session_store: active_record_store
Eduardo

3
rake db:sessions:createkhông được chấp nhận và bị loại bỏ trong Rails 4, vì nó không mở rộng quy mô tốt cho các ứng dụng có nhiều người dùng (quá nhiều cơ sở dữ liệu đọc và ghi). Xem rails 4.0, rake db: session: create .

53

Cookie được mã hóa theo mặc định trong Rails 4

Trong Rails 4, cookie CookieStore được mã hóa và ký theo mặc định:

Nếu bạn chỉ secret_tokenđặt, cookie của bạn sẽ được ký, nhưng không được mã hóa. Điều này có nghĩa là người dùng không thể thay đổi khóa của họ user_idmà không biết khóa bí mật của ứng dụng của bạn, nhưng có thể dễ dàng đọc khóa của họ user_id. Đây là mặc định cho các ứng dụng Rails 3.

Nếu bạn đã secret_key_baseđặt, cookie của bạn sẽ được mã hóa. Điều này tiến xa hơn một bước so với cookie đã ký ở chỗ người dùng không thể thay đổi hoặc đọc cookie được mã hóa. Đây là mặc định bắt đầu trong Rails 4.

Nếu bạn có cả hai secret_tokensecret_key_basethiết lập, cookie của bạn sẽ được mã hóa và các cookie đã ký do Rails 3 tạo ra sẽ được đọc và mã hóa rõ ràng để cung cấp một đường dẫn nâng cấp suôn sẻ.

Lưu trữ phiên bản ghi hoạt động không được chấp nhận trong Rails 4

Câu trả lời này hiện đã lỗi thời đối với Rails 4. Active Record Session Store đã không còn được dùng nữa và bị xóa khỏi Rails, vì vậy các trình tạo sau sẽ không còn hoạt động:

  • rake db:sessions:create

  • rails generate session_migration

Điều này đã được chỉ ra trong câu trả lời này . Lý do mà Active Record Session Store không được dùng nữa là do các lần đọc / ghi vào cơ sở dữ liệu không mở rộng quy mô tốt khi bạn có một số lượng lớn người dùng truy cập vào ứng dụng của mình, như đã nêu trong bài đăng trên blog này :

... một vấn đề chính với kho lưu trữ phiên Active Record là nó không thể mở rộng. Nó đặt một tải không cần thiết vào cơ sở dữ liệu của bạn. Một khi ứng dụng của bạn nhận được một lượng lớn lưu lượng truy cập, bảng cơ sở dữ liệu phiên liên tục bị bắn phá với các hoạt động đọc / ghi.

Kể từ Rails 4, kho lưu trữ phiên Active Record đã bị xóa khỏi khung cốt lõi và hiện không được dùng nữa.

Nếu bạn vẫn muốn sử dụng Active Record Session Store, nó vẫn có sẵn dưới dạng đá quý .

Các phương pháp hay nhất về phiên Rails hiện tại

Để biết thêm các phương pháp hay nhất hiện tại cho các phiên Ruby on Rails, tôi khuyên bạn nên xem các phiên bản mới nhất của Hướng dẫn bảo mật Ruby on Rails .


9

Tôi không tin rằng bất cứ điều gì đã thay đổi về cách mọi người trên bất kỳ nền tảng nào sẽ xử lý các phiên dựa trên cookie. Hãy hoài nghi về bất kỳ điều gì vượt quá tầm kiểm soát của máy chủ (cookie, bài đăng trên biểu mẫu, v.v.) Đó là nguyên tắc chung của phát triển web.

Về phần mã hóa, tôi không biết liệu có gì thay đổi trên mặt trận đó hay không.

Một điều cần lưu ý với kho lưu trữ cookie là giới hạn số lượng dữ liệu và điều cần biết là dữ liệu này sẽ được gửi trực tuyến trong mọi yêu cầu, nơi lưu trữ cơ sở dữ liệu chỉ chuyển id và dữ liệu tồn tại trên máy chủ .


4

FWIW, rails 3.1 gợi ý chạy

rails generate session_migration

Tuy nhiên, điều này tạo ra quá trình di chuyển giống hệt như

rake db:sessions:create

Đồng thời, tác vụ cào db:sessions:createbây giờ trực tiếp gọi ra trình session_migrationtạo. task: create =>: environment làm tăng "Tác vụ không khả dụng với cơ sở dữ liệu này (không hỗ trợ di chuyển)" trừ khi ActiveRecord :: Base.connection.supports_migrations? yêu cầu 'rails / máy phát điện' Rails :: Generators.configure! request 'rails / Generators / rails / session_migration / session_migration_generator' Rails :: Generators :: SessionMigrationGenerator.start [ENV ["MIGRATION"] || "add_sessions_table"] kết thúc
nghiêng

Các trình tạo rake db:sessions:createrails generate session_migrationkhông được chấp nhận và bị loại bỏ trong Rails 4, vì chúng không mở rộng quy mô tốt cho các ứng dụng có nhiều người dùng (quá nhiều cơ sở dữ liệu đọc và ghi). Xem rails 4.0, rake db: session: create .

2

Các mặc định của Rails có vẻ khá tốt đối với tôi- CookieStore nhanh và sẽ đáp ứng được phần lớn các trường hợp sử dụng. Chắc chắn rằng bạn bị giới hạn ở 4kb và dữ liệu của bạn sẽ được hiển thị cho người dùng, nhưng cách Rails là chỉ sử dụng phiên cho những thứ như ID số nguyên và giá trị chuỗi cơ bản- Nếu bạn đang cố gắng lưu trữ các đối tượng hoặc thông tin bảo mật cao trong phiên có lẽ bạn đang làm sai.

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.