如何调用从视图下拉框传递到控制器的Helper函数?
解决方法
首先要明确:直接执行POST传过来的字符串存在安全风险,必须先做白名单校验和必要的字符串清理,再调用目标函数。
步骤1:优化视图(可选但推荐)
把下拉框的option值改为纯函数名,省去后续字符串处理步骤:
<select name="FUNCT_NAME"> <option value="test">调用test函数</option> </select>
步骤2:控制器中安全调用函数
情况1:视图传的是原数据test();
$func_str = $this->input->post('FUNCT_NAME'); // 提取纯函数名:移除括号和分号 $func_name = trim(str_replace(['()', ';'], '', $func_str)); // 定义允许调用的函数白名单,防止恶意注入 $allowed_funcs = ['test']; // 校验函数是否在白名单且已存在 if (in_array($func_name, $allowed_funcs) && function_exists($func_name)) { $func_name(); // 调用test函数,输出"Got here" } else { echo '不允许的函数调用'; }
情况2:视图传的是纯函数名test
代码更简洁:
$func_name = $this->input->post('FUNCT_NAME'); $allowed_funcs = ['test']; if (in_array($func_name, $allowed_funcs) && function_exists($func_name)) { $func_name(); } else { echo '不允许的函数调用'; }
关键注意事项
- 绝对不能直接使用
eval($func_name)执行字符串,这会引发严重的代码注入漏洞。 - 必须通过白名单限制可调用的函数,只允许预先定义的helper函数被触发。
内容的提问来源于stack exchange,提问作者Raham
相关产品推荐
相关产品推荐

