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
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
Đ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
@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