2012-04-03 28 views
57

Tôi là nhà phát triển PHP học Ruby on Rails bằng cách đọc Michael Hartl's tutorial. Dưới đây là một trích dẫn từ cuốn sách, đề cập đến csrf_meta_tag:Đường ray: CSrf_meta_tag hoạt động như thế nào?

... Rails phương pháp csrf_meta_tag [ngăn chặn] cross-site yêu cầu giả mạo (CSRF), một loại tấn công web độc hại. Đừng lo lắng về các chi tiết (tôi không); chỉ biết rằng Rails đang nỗ lực để giữ an toàn cho ứng dụng của bạn.

Điều này, tôi thực sự tò mò. Làm cách nào để chèn các thẻ meta csrf-paramcsrf-token ngăn chặn CSRF? Tôi đã thử Googling, nhưng không thể tìm thấy gì cả.

+2

Hãy để tôi google đó cho bạn http://stackoverflow.com/questions/941594/understand-rails-authenticity-token –

+6

@MikhailNikalyukin Cảm ơn (tôi suy nghĩ). Điều đó giải thích CSRF, mà tôi đã biết những điều cơ bản, nhưng nó không giải thích cách * các thẻ meta * (trái ngược với các trường biểu mẫu ẩn) có thể ngăn chặn nó. Bạn có biết câu trả lời cho điều đó không? – Nick

Trả lời

68

csrf_meta_tag về cơ bản hoàn thành giống như trường biểu mẫu ẩn nhưng ở đó để cung cấp cho các yêu cầu javascript không được gắn với biểu mẫu một cách dễ dàng để nhận mã thông báo.

Nếu bạn sử dụng thư viện jquery-ujs, nội dung của thẻ meta đó được thêm tự động (làm tiêu đề yêu cầu) vào bất kỳ yêu cầu ajax nào được thực hiện.

+0

Ngắn và ngọt. Bạn đã trả lời câu hỏi của tôi. Cảm ơn! – Nick

+0

Chỉ cần hoàn thành: [bài viết này] (http://robots.thoughtery.com/a-tour-of-rails-jquery-ujs) đề cập rằng ujs cũng có thể sử dụng chúng để cập nhật bộ nhớ cache đã lỗi thời. [Dòng nguồn uJS có liên quan] (https://github.com/rails/jquery-ujs/blob/57f4848652584f33018e46414605a873194a97d7/src/rails.js#L57). Và chỉ trong trường hợp có một newbs như tôi tự hỏi: 'form_tag' và những người trợ giúp khác cũng thêm mã thông báo CSRF vào biểu mẫu, vì vậy chúng hoạt động không có Js. –

52

csrf_meta_tag chèn nội dung chữ ký số vào trang, hoạt động như xác minh rằng các yêu cầu đến máy chủ ứng dụng thực tế là từ người dùng đã đăng nhập chính xác. Điều này giúp ngăn chặn việc tạo tập lệnh cross-site (một tập lệnh trên một trang hoàn toàn không liên quan kích hoạt yêu cầu nói, GMail, trong khi bạn đăng nhập vào Gmail của mình trong một tab khác).

Tôi dự định làm rõ, bản thân số csrf_meta_tag không ngăn trang không liên quan kích hoạt yêu cầu GMail của bạn (hoặc bất kỳ dịch vụ nào khác là mục tiêu của cuộc tấn công), nhưng "chữ ký số" trong csrf_meta_tag là được sử dụng để xác minh tính hợp lệ của các yêu cầu đã nêu. Yêu cầu không hợp lệ (tức là từ các nỗ lực tạo tập lệnh chéo trang) sẽ không được xác thực và do đó bị hủy.

Nói cách khác, từ quan điểm của kẻ tấn công của xem:

Trước csrf_meta_tags tồn tại (họ không loại trừ để Rails bằng bất kỳ phương tiện), cho phép cross-site tấn công kịch bản thành công một trang web độc hại để gửi dữ liệu vào một ứng dụng web theo cách khiến yêu cầu xuất hiện như thể nó đang được thực hiện thay mặt người dùng. Vì vậy, giả sử bạn là quản trị viên trên dịch vụ web và trong một tab trình duyệt, bạn đã đăng nhập vào bảng điều khiển quản trị cho dịch vụ đó. Nếu trang web độc hại mở trong tab khác nhắm mục tiêu dịch vụ của bạn để tấn công, trang web độc hại có thể chạy tập lệnh tạo yêu cầu quản trị, chẳng hạn như danh sách bán phá giá của người dùng khỏi cơ sở dữ liệu, đánh cắp dữ liệu nhạy cảm khác hoặc gây hại, gây hại hoặc hủy dữ liệu chứa trong dịch vụ, tất cả trong khi xuất hiện (từ quan điểm của máy chủ) là yêu cầu hợp lệ từ chính quản trị viên. csrf_meta_tag là một cách để ký yêu cầu và giúp ngăn chặn những nỗ lực đó thành công.

Có giải thích chi tiết hơn available here.

Cũng sẽ là giáo dục để thực hiện "nguồn xem" trên một trong các trang do Rails tạo và bạn sẽ thấy thẻ CSRF trông như thế nào.

+1

Cảm ơn câu trả lời chi tiết! Mặc dù nó rất hữu ích và tôi đã có thể học hỏi từ nó, nó không giải thích cách * các thẻ meta * giúp đỡ với việc ngăn chặn CSRF (trái với các trường biểu mẫu ẩn). Nhưng tôi thực sự đánh giá cao thời gian của bạn. Cảm ơn một lần nữa! – Nick

13

Trong Rails nó sẽ làm việc như cách này

def csrf_meta_tags 
    if protect_against_forgery? 
     [ 
     tag('meta', :name => 'csrf-param', :content => request_forgery_protection_token), 
     tag('meta', :name => 'csrf-token', :content => form_authenticity_token) 
     ].join("\n").html_safe 
    end 
    end 

See more details just click

Bạn cũng cần phải kiểm tra Ruby On Rails Security Guide

ở đây là đẹp blog

NHƯNG - Tôi prefere Vulnerability Quốc Cơ sở dữ liệu, đây là lời giải thích tốt

CWE-352: Cross-Site Request Forgery (CSRF)

CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Check this document for CWE - Common Weakness Enumeration

+1

Các liên kết tuyệt vời đến cơ sở dữ liệu dễ bị tổn thương! – jefflunt

+2

Cảm ơn câu trả lời chi tiết! Mặc dù nó rất hữu ích và tôi đã có thể học hỏi từ nó, nó không giải thích cách * các thẻ meta * giúp đỡ với việc ngăn chặn CSRF (trái với các trường biểu mẫu ẩn). Tuy nhiên, liên kết đến mã nguồn đã giải thích một chút. Dù sao, tôi thực sự đánh giá cao thời gian của bạn. Cảm ơn một lần nữa! – Nick

+0

Xin chào Nick, tôi có hướng của câu hỏi, tôi sẽ thay đổi câu trả lời của tôi rất sớm và cập nhật cho bạn. Chủ yếu là vào cuối tuần này. –

4

csrf_meta_tags những dấu hiệu cho các yêu cầu ajax để sử dụng như là một trong những tham số hình thức để thực hiện một yêu cầu đến máy chủ. Rails hy vọng csrf là ​​một phần của thân hình (params) của bạn để xử lý các yêu cầu của bạn. Sử dụng các thẻ meta này, bạn có thể tạo cấu trúc biểu mẫu hoặc tiêu đề csrf cho phù hợp với nhu cầu của bạn. Tôi hy vọng câu trả lời này sẽ giúp câu hỏi của bạn.

0

Output của helper csrf_meta_tags:

<meta name="csrf-param" content="authenticity_token" /> 
<meta name="csrf-token" content="J/gw2ePXHS9Z1SUSSeUQgMmPhsPEFlFbMrLTLFHLfKjeWh7g4uyOnBlfKnlZlmCBiALDWdDWCSo1z0tybGVtfA==" /> 

dấu hiệu này có thể được bao gồm trong yêu cầu ajax. Exapmle (jquery-ujs):

https://github.com/rails/jquery-ujs/blob/4b6e30f68ff1244fc0c790641d3408c2695a29bd/src/rails.js#L70

csrfToken: function() { 
    return $('meta[name=csrf-token]').attr('content'); 
    }, 

    // URL param that must contain the CSRF token 
    csrfParam: function() { 
    return $('meta[name=csrf-param]').attr('content'); 
    }, 

    // Make sure that every Ajax request sends the CSRF token 
    CSRFProtection: function(xhr) { 
     var token = rails.csrfToken(); 
     if (token) xhr.setRequestHeader('X-CSRF-Token', token); 
    }, 
Các vấn đề liên quan