如何根據(jù)名稱動(dòng)態(tài)調(diào)用方法?當(dāng)名稱包含在字符串變量中時(shí),如何動(dòng)態(tài)調(diào)用方法?例如:class MyClass
def foo; end
def bar; endendobj = MyClass.new
str = get_data_from_user # e.g. `gets`, `params`, DB access, etc.str #=> "foo"# somehow call `foo` on `obj` using the value in `str`.我怎樣才能做到這一點(diǎn)?這樣做是否存在安全風(fēng)險(xiǎn)?
3 回答

夢(mèng)里花落0921
TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
您想要做的是稱為動(dòng)態(tài)調(diào)度。在Ruby中它很容易,只需使用public_send
:
method_name = 'foobar'obj.public_send(method_name) if obj.respond_to? method_name
如果該方法是私有/受保護(hù)的,請(qǐng)send
改用,但更喜歡public_send
。
如果價(jià)值method_name
來(lái)自用戶,則存在潛在的安全風(fēng)險(xiǎn)。要防止漏洞,您應(yīng)該驗(yàn)證哪些方法可以實(shí)際調(diào)用。例如:
if obj.respond_to?(method_name) && %w[foo bar].include?(method_name) obj.send(method_name)end

忽然笑
TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊
你真的要小心這個(gè)。使用用戶數(shù)據(jù)來(lái)調(diào)用任何方法send
可以為用戶打開(kāi)空間以執(zhí)行他們想要的任何方法。 send
通常用于動(dòng)態(tài)調(diào)用方法名稱 - 但要確保輸入值是可信的并且不能由用戶操縱。
黃金法則永遠(yuǎn)不會(huì)信任來(lái)自用戶的任何輸入
- 3 回答
- 0 關(guān)注
- 651 瀏覽
添加回答
舉報(bào)
0/150
提交
取消