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'
0