Một số cái cần lưu ý khi lập trình ruby on rails
Bài đăng này đã không được cập nhật trong 7 năm
Dưới đây là một số cái cần lưu ý khi bạn lập trinh ruby on rails. Có những cái lập trình viên thương sử dụng nhưng không nghĩ tới nguy cơ mà nó tạo ra.
Giới hạn thuộc tính
Giới hạn các thuộc tính cần gán cho đối tượng, dùng permit() để đảm bảo số lượng thuộc tính luôn luôn nằm trong một số cái nhất định, không vượt qua giới hạn cho phép.
// không an toàn
params = { name: 'Me', Password: 'MyPassword'} // có thể người dùng chuyển thêm các params khác vd: type là Admin
User.create(params)
// An toàn
User.create(params.permit(:name, :password))
User.first.update(params.permit(:address))
Nguy cơ khi dùng send, eval
Những thông tin nhập bằng người dùng không dùng với send hoặc eval
// không an toàn
@result = User.send(params[:type]) // params[:type] = "delete_all" => User.delete_all
// an toàn
type = params[:type] == "admin" ? "admin" : "member"
@result = User.send(type) //giới hạn type người dùng nhập vào
// không an toàn
@result = eval(params[:value]) // nếu params[:value] = "User.delete_all" sẽ thực hiện xóa hết các dữ liệu của user
Render view bằng params
# Unsafe
def show
render params[:view] # params[:view] = "edit"
end
# Trường hợp này mặc dù mình đã giới hạn quyền edit nhưng trang show không giới hạn thì người ta vẫn vào chỉnh sửa được thông qua action show
Truy cập file
Không sử dụng params nhập của người dùng để truy cập file
# Không an toàn
File.open("tmp/#{params[:myfilename]}") # người dùng có thể truy cập các file khac theo params
SQL injection
# Không an toàn
params[:id] = "(1) OR 1=1"
User.where("id = #{params[:id]}").destroy_all
# // SELECT `users`.* FROM `users` WHERE (id = (1) OR 1=1)
# => lấy ra tất cả các user
# an toàn
User.where("id = ?", params[:id]).destroy_all
# //SELECT `users`.* FROM `users` WHERE (id = '(1) OR 1=1')
# => lấy ra các user có id là '(1) OR 1=1'
All rights reserved