亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據名稱動態調用方法?

如何根據名稱動態調用方法?

犯罪嫌疑人X 2019-07-23 14:33:53
如何根據名稱動態調用方法?當名稱包含在字符串變量中時,如何動態調用方法?例如: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`.我怎樣才能做到這一點?這樣做是否存在安全風險?
查看完整描述

3 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

您想要做的是稱為動態調度。在Ruby中它很容易,只需使用public_send

method_name = 'foobar'obj.public_send(method_name) if obj.respond_to? method_name

如果該方法是私有/受保護的,請send改用,但更喜歡public_send。

如果價值method_name來自用戶,則存在潛在的安全風險。要防止漏洞,您應該驗證哪些方法可以實際調用。例如:

if obj.respond_to?(method_name) && %w[foo bar].include?(method_name)
  obj.send(method_name)end


查看完整回答
反對 回復 2019-07-23
?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

真的要小心這個。使用用戶數據來調用任何方法send可以為用戶打開空間以執行他們想要的任何方法。 send通常用于動態調用方法名稱 - 但要確保輸入值是可信的并且不能由用戶操縱。

黃金法則永遠不會信任來自用戶的任何輸入


查看完整回答
反對 回復 2019-07-23
  • 3 回答
  • 0 關注
  • 654 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號