7

Tôi hiện có bộ điều khiển chụp một số html từ TinyMCE ở giao diện người dùng. Nếu tôi tinker với firebug nó có thể gửi thẻ script và tiêm thông điệp cảnh báo vv trên màn hình.Cách tốt nhất để khử trùng các trường trong ruby ​​trên đường ray

chỉnh sửa: Hiện nay tôi đang sửa chữa này trong mô hình bằng cách sử dụng các helper Sanitize:

require 'action_view' 

class NotesController < AuthApplicationController 

    include ActionView::Helpers::SanitizeHelper 
... 
    def update 
    params[:note][:content] = sanitize(params[:note][:content], 
     :tags => %w(a object p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 

    @note.update_attributes(params[:note]) 

này cảm thấy lộn xộn trong bộ điều khiển. Có cách nào tốt hơn? I E. bằng cách nào đó tích hợp ActiveRecord này để tôi có thể dễ dàng xác định để làm điều này với trường này và các trường khác trước khi lưu theo cách tương tự để xác thực?

Cảm ơn mọi đề xuất.

chỉnh sửa:

Làm một số tiến bộ ở đây.

Theo tôi/Libs Tôi có

module SanitizeUtilities 
    def sanitize_tiny_mce(field) 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 
end 

Sau đó, trong mô hình của tôi mã sụp đổ để

class MyModel < ActiveRecord::Base 
    include ::SanitizeUtilities 
... 
    before_save :sanitize_content 
... 
    def sanitize_content 
    self.content = sanitize_tiny_mce(self.content) 
    end 

end 

Điều này dường như loại bỏ đánh dấu không mong muốn mà không cần quá nhiều phiền phức.

Khá mới đối với đường ray nên lo lắng Tôi có thể đang làm điều gì đó sai. Ai có thể thấy những hạn chế tiềm năng ở đây?

Cảm ơn một lần nữa

+0

Cách thông thường hơn để xử lý điều này trong đường ray là chấp nhận bất kỳ crap cũ nào từ máy khách và lưu nó (an toàn, cẩn thận để tránh việc tiêm SQL). Sau đó, khi đến lúc hiển thị, hãy vệ sinh ở đó. – noodl

+2

Điều đó có vẻ kỳ quặc đối với tôi, tại sao tôi muốn cam kết dữ liệu bẩn? Điều đó sẽ làm tăng công việc và cơ hội bị mất vệ sinh nếu tôi đọc dữ liệu ở nhiều nơi. – Chris

+0

@noodl Đồng ý với Chris về vấn đề này. Tước dữ liệu lên phía trước có nghĩa là bạn chỉ phải chịu quá trình này một lần. Không tước nó ra có nghĩa là bạn phải chịu đựng quá trình này mỗi khi bạn hiển thị dữ liệu. Và như Chris đã nói, bạn có thể quên bảo vệ tầm nhìn. – iwasrobbed

Trả lời

11

Tôi nghĩ rằng cách bạn đang làm việc đó là tốt, nhưng nếu bạn đang sử dụng before_save sau đó bạn có thể có khả năng vẫn không hợp lệ (kể từ before_save được gọi sau khi kiểm chứng thực). Ngoài ra, bạn không nhất thiết phải đặt nó vào mô-đun riêng của nó, nó chỉ có thể là một phương pháp riêng trên lớp của bạn.

Cái gì như:

class MyModel < ActiveRecord::Base 

    before_validation :sanitize_content, :on => :create 

    private 
    def sanitize_content 
     self.content = sanitize_tiny_mce(self.content) 
    end 
    def sanitize_tiny_mce(field) 
     ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data)); 
    end 

end 
+0

có lẽ là trên: [: tạo,: cập nhật] 'quá ... bất kỳ phương pháp hay nhất nào khác? – Meekohi

1

Câu hỏi này dường như được giải đáp nhưng đối với bất cứ ai đến đây bạn có thể muốn xem xét sử dụng mutators tùy chỉnh để làm cho minh bạch hơn. Một cái gì đó như:

class MyModel < ActiveRecord::Base 
    def content= content 
    write_attribute(:content, sanitize_tiny_mce(content) 
    end 

    private 

    def sanitize_tiny_mce content 
    ActionController::Base.helpers.sanitize(field, 
     :tags => %w(a b i strong em p param h1 h2 h3 h4 h5 h6 br hr ul li img), 
     :attributes => %w(href name src type value width height data) 
    ); 
    end 
end 

Điều này sẽ đảm bảo nội dung được khử trùng bất cứ khi nào thay đổi.