2013-08-04 28 views
12

mã cấu hình của tôiSinatra/1.4.3 sử dụng rack :: phiên :: cảnh báo Cookie

require 'sinatra' 

#set :environment, :production 
enable :sessions 
enable :logging 
set run: true 

case 
    when production? 
    set port: 8081 
    when development? 
    require 'sinatra/reloader' 
    require 'better_errors' 
    use BetterErrors::Middleware 
    BetterErrors.application_root = __dir__ 
end 

use Rack::Session::Cookie, key: 'N&wedhSDF', 
    domain: "localhost", 
    path: '/', 
    expire_after: 14400, 
    secret: '*&(^B234' 

get '/' do 
    erb :hello 
end 

Nó vẫn cho thấy một cảnh báo:

SECURITY WARNING: No secret option provided to Rack::Session::Cookie. 
This poses a security threat. It is strongly recommended that you 
provide a secret to prevent exploits that may be possible from crafted 
cookies. This will not be supported in future versions of Rack, and 
future versions will even invalidate your existing user cookies. 

nhưng nó không hiển thị trên sản

câu hỏi là, tại sao nó vẫn hiển thị cảnh báo ngay cả khi Rack :: Session :: Cookie đã được đặt?

Trả lời

34

Bạn đang sử dụng cả hai

enable :sessions 

makes Sinatra setup cookie based sessions, và

use Rack::Session::Cookie, ... 

mà cũng cho biết thêm phiên để ứng dụng của bạn, vì vậy bạn kết thúc với hai trường hợp của Rack::Session::Cookie trong middleware ngăn xếp của bạn.

Cảnh báo đang được tạo bởi phần mềm trung gian phiên bao gồm bởi Sinatra. Theo mặc định Sinatra doesn’t create a session secret when running in the development environment (ở chế độ cổ điển ít nhất, nó cho các ứng dụng mô-đun), và vì vậy Rack tạo ra cảnh báo trong phát triển.

Bạn chỉ cần một trong hai cách bật phiên, sử dụng hai phiên có thể dẫn đến việc chúng tương tác theo những cách không mong muốn.

Để tránh các cảnh báo, bạn rõ ràng có thể thiết lập một bí mật cho phiên với các tùy chọn session_secret Sinatra:

enable :sessions 
set :session_secret, '*&(^B234' 

Bạn cũng có thể vượt qua các tùy chọn băm như một cuộc tranh cãi khi cho phép phiên. Thay vì enable :sessions, hãy thực hiện việc này:

set :sessions, key: 'N&wedhSDF', 
    domain: "localhost", 
    path: '/', 
    expire_after: 14400, 
    secret: '*&(^B234' 
+0

Bạn có thể giải thích cách đặt '' session_secret'' không? Tôi đã tìm kiếm một câu trả lời nhưng tôi không thể tìm thấy nó ở đâu cả. Đoán tốt nhất của tôi là nó sử dụng nó như một muối cho băm để mọi người không thể giả mạo cookie. – Piccolo

+0

@Piccolo Có, nó là để ngăn chặn người giả mạo cookie, nhưng nó được sử dụng như là chìa khóa trong một [HMAC] (https://en.wikipedia.org/wiki/Hash-based_message_authentication_code) chứ không phải là muối. Kiểm tra [Mã phiên cookie giá] (https://github.com/rack/rack/blob/1.6.4/lib/rack/session/cookie.rb) để biết thêm thông tin. – matt

+0

Cảm ơn rất nhiều! Tôi đang xem xét nó ngay bây giờ. Ngoài ra, có lý do nào khiến tôi không thể tạo ra khóa bí mật mới khi bắt đầu đơn đăng ký của mình không? – Piccolo