12/08/2018, 15:42
Một số cái cần lưu ý khi lập trình ruby on rails
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 ...
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'