考虑我在控制器中有一个show方法,如下所示:
class ThingsController < ApplicationController
def show
thing = Thing.find_by_id(params[:id])
render json: 'Not Found', status: :not_found and return if !thing
render json: thing.to_json, status: :ok
end
end
数据库中只有1条记录,id = 1。
现在,这是我的测试:
#4正常吗?如何防止?
Rails版本:4.2.6
答案 0 :(得分:2)
.find_by_id()
方法将参数传递给整数,因为1a.to_i
是1
,它返回一个记录值。
如果你想阻止这种情况,你必须检查传入的param[:id]
是否仅包含数字。
'1a' !~ /\D/ # false
'12' !~ /\D/ # true
# So, use it in the if
params[:id] !~ /\D/
答案 1 :(得分:1)
因为id的类型是整数,所以在使用to_i
函数创建查询字符串之前,活动记录会将其转换为整数。如果您不希望用户使用此类链接查看详细信息,则有许多方法可以防止,例如某些方法:
1.Validate params [:id]是ThingsController
2.在find_by_id
Thing
class class Thing < ActiveRecord::Base
def self.find_by_id(id)
validate_type_id!(id) # Have to define the function to raise not found exception if invalid format type
super
end
end