Thông số mạnh và attr_accessible
là hai cách khác nhau để thêm bảo vệ an ninh vào tính năng "chuyển nhượng hàng loạt" Rails. Tham số mạnh là cách được quy định bởi phiên bản hiện tại của Rails.
"Chuyển nhượng hàng loạt" là viết tắt thuận tiện trong Rails cho phép bạn đặt nhiều thuộc tính của mô hình trong một câu lệnh.
Ví dụ: hãy tưởng tượng bạn có một số @user
mà bạn muốn cập nhật với dữ liệu từ gửi biểu mẫu. Không có bài tập hàng loạt, bạn phải viết mã tẻ nhạt như thế này:
@user.first_name = params[:user][:first_name]
@user.last_name = params[:user][:last_name]
@user.phone_number = params[:user][:phone_number]
...
@user.save
Và bật và bật cho mọi trường biểu mẫu.
Với nhiệm vụ đại chúng, tất cả các mã đó trở thành một dòng duy nhất:
@user.update(params[:user])
Nhưng, đây là đầy đủ các lỗ hổng bảo mật. Vì params
chứa bất kỳ dữ liệu nào được trình duyệt gửi, một người dùng độc hại có thể thêm dữ liệu vào nội dung gửi mà bạn không mong đợi. Ví dụ: họ có thể thêm is_admin=1
vào tham số. Nếu bạn có cột cơ sở dữ liệu is_admin
thì việc chuyển nhượng hàng loạt chỉ cho phép người dùng nâng cấp lên quản trị viên. Yikes!
Đây là nơi tham số mạnh mẽ đi kèm. Với thông số mạnh, đường ray sẽ tăng ActiveModel::ForbiddenAttributesError
nếu bạn cố gắng làm điều ngây thơ update(params[:user])
. Thay vào đó, bạn cần phải rõ ràng về những thông số bạn mong đợi từ việc gửi trình duyệt, sử dụng các trình trợ giúp require
và permit
mà Thông số mạnh cung cấp. Như thế này:
def user_params
# Note that :is_admin is not permitted!
params.require(:user).permit(:first_name, :last_name, :phone_number)
end
...
@user.update(user_params)
Tôi không thể nói cho người duy trì Rails, nhưng tôi thích thông số mạnh vì nó linh hoạt. Nếu tôi có nhiều hành động trong bộ điều khiển người dùng mong đợi các tham số khác nhau, tôi có thể dễ dàng mô tả bằng cách sử dụng các thông số cần được cho phép sử dụng permit
.
Hoặc nếu tôi có vai trò người dùng khác nhau được phép cập nhật các thuộc tính khác nhau, thì tôi có thể dễ dàng mô hình các quyền đó. Như @ CV-Gate đã đề cập, bạn thậm chí có thể thay đổi các quyền này trong thời gian chạy, đây là một quyền lực mạnh mẽ.
Tóm lại, tính linh hoạt của Thông số mạnh là do bạn có thể xác định phương thức user_params
ở bất kỳ đâu và theo ý bạn muốn. Bạn có toàn bộ sức mạnh của các khái niệm Ruby và OO để làm cho nó hoạt động theo cách bạn muốn.
Còn khoảng attr_accessible
thì sao?
Mà không đi sâu vào chi tiết quá nhiều (vì tính năng này không còn được hỗ trợ bởi Rails): thay vì sử dụng các phương pháp permit
, bạn sẽ làm điều gì đó tương tự như sử dụng một vĩ mô attr_accessible
trong mô hình riêng của mình, như thế này:
class User < ActiveRecord::Base
attr_accessible :first_name, :last_name, :phone_number
...
end
Vì vậy, đối với các trường hợp đơn giản, nó hoạt động rất giống với Thông số mạnh; bạn chỉ cần xác định danh sách các thuộc tính ở một vị trí khác.
Tuy nhiên, vì attr_accessible
được kết hợp chặt chẽ với định nghĩa của lớp mô hình, bạn mất rất nhiều tính linh hoạt.Điều gì sẽ xảy ra nếu bạn có hai hành động điều khiển khác nhau cần thực hiện phép gán khối lượng cho cùng một mô hình User
? Bây giờ bạn đang mắc kẹt.
attr_accessor
Các attr_accessor
vĩ mô được xây dựng vào Ruby và không có gì để làm với Rails, chuyển nhượng hàng loạt, hoặc an ninh. Nó chỉ xảy ra để có một tên tương tự. :)