2012-04-16 43 views
22

Khi tôi cố gắng POST từ RestKit, có một cảnh báo trong Rails console:Rails lãm "CẢNH BÁO: Không thể xác minh tính xác thực CSRF mã thông báo" từ một RestKit POST

Started POST "/friends" for 127.0.0.1 at 2012-04-16 09:58:10 +0800 
Processing by FriendsController#create as */* 
Parameters: {"friend"=>{"myself_id"=>"m001", "friend_id"=>"f001"}} 
WARNING: Can't verify CSRF token authenticity 
(0.1ms) BEGIN 
SQL (1.7ms) INSERT INTO `friends` (`friend_id`, `myself_id`) VALUES ('f001', 'm001') 
(1.1ms) COMMIT 
Redirected to http://127.0.0.1:3000/friends/8 
Completed 302 Found in 6ms (ActiveRecord: 3.0ms) 

Dưới đây là mã khách hàng:

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init]; 
[attributes setObject: @"f001" forKey: @"friend_id"]; 
[attributes setObject: @"m001" forKey: @"myself_id"]; 
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObject:attributes forKey:@"friend"]; 
[[RKClient sharedClient] post:@"/friends" params:params delegate:self]; 

Làm cách nào để thoát khỏi cảnh báo?

Trả lời

71

Bạn có thể loại bỏ một cách an toàn những lời cảnh báo như sau:

skip_before_filter :verify_authenticity_token 

này nên đi vào từng điều khiển API Rails mà bạn có, hoặc nếu bạn có một base_controller cho tất cả các bộ điều khiển API sau đó đặt nó ở đó.

Nếu bạn cũng có thể truy cập ứng dụng của mình thông qua trình duyệt web thì không đặt dòng này vào số application_controller vì bạn sẽ tạo lỗ hổng bảo mật.

Có thể xóa an toàn csrf cho các cuộc gọi API vì lỗ hổng cụ thể chỉ có thể được thực hiện thông qua trình duyệt web.

Cập nhật 16 tháng 12 năm 2013

Tôi đã nhìn thấy một số liên kết đến các câu trả lời này và một số nội dung khác mà đề nghị làm rõ. API có thể dễ bị tấn công bởi CSRF nếu bạn sử dụng phương pháp xác thực dựa trên web để xác thực API - ví dụ: phiên hoặc cookie.

Có một số chi tiết tốt trong Is your Web API susceptible to a CSRF exploit?.

Lời khuyên của tôi vẫn là viết tắt của người dùng RestKit vì thông tin đăng nhập của người dùng dường như không dựa trên phiên hoặc cookie mà thay vào đó là tên người dùng hoặc khóa api.

Nếu API của bạn có thể được xác thực bằng phiên hoặc cookie thì bạn nên tránh bỏ qua : verify_authenticity_token và bạn nên suy nghĩ về việc chuyển sang xác thực dựa trên khóa api.

Nếu API của bạn có thể được xác thực bằng tên người dùng và mật khẩu cũng được sử dụng để xác thực trên web thì vẫn có tiềm năng khai thác, mặc dù nó ít nghiêm trọng hơn vì yêu cầu người dùng nhập tên người dùng và mật khẩu của họ vào trang web của bạn trong hộp thách thức Xác thực HTTP khi truy cập trang web bằng cách khai thác. Một lần nữa, để bảo mật tốt nhất bạn nên suy nghĩ về việc chuyển sang xác thực dựa trên khóa api. Cần lưu ý rằng tôi không đồng ý rằng bạn cần phải thêm :only => [:your_method] để được bảo vệ bổ sung, miễn là bạn có bộ điều khiển api riêng biệt, api của bạn không được trộn lẫn với phản hồi trên web của bạn và bạn không sử dụng phiên hoặc cookie. Nếu đây là những nơi bạn có thể thêm một cách an toàn skip_before_filter vào một số base_controller cho api của bạn.

+30

Để tránh mở lỗ lớn, tôi khuyên bạn nên bỏ qua xác minh chỉ dành cho phương pháp của mình. 'skip_before_filter: verify_authenticity_token: only => [: your_method]' –

+15

để cắt và dán đoạn mã trên: 'skip_before_filter: verify_authenticity_token,: only => [: your_method]' Marc quên dấu phẩy. KHÔNG thấy nút chỉnh sửa. – pjammer

+0

Cảm ơn thông tin chi tiết này .. –

Các vấn đề liên quan