Ruby on Rails如何运行数据库中存储的用户提交Ruby ERB模板代码
问题原因
你遇到的问题本质是raw辅助方法仅会跳过HTML转义逻辑,不会将数据库中存储的包含ERB标签的字符串识别为Rails模板进行解析,因此<% %>这类ERB执行标签会原样输出到浏览器,不会触发Ruby代码执行。你尝试直接用puts输出时报模板不存在错误,是因为puts会将内容输出到服务器控制台而非视图层,返回值为nil,若你错误调用了渲染方法将字符串识别为模板路径,就会触发该错误。
解决方案
你可以手动调用Ruby内置的ERB库来解析模板字符串,同时需要将模板依赖的变量绑定到执行上下文:
- 先定义辅助渲染方法,可放在
app/helpers/posts_helper.rb中:
def render_custom_erb(template_str, instance_vars = {}) # 初始化ERB解析器 erb = ERB.new(template_str) # 构造独立的空白执行上下文,避免泄露服务端数据 execution_context = Object.new # 批量注入模板需要的实例变量 instance_vars.each do |var_name, var_value| execution_context.instance_variable_set("@#{var_name}", var_value) end # 执行模板并返回渲染结果 erb.result(execution_context.binding) end
- 视图中调用该方法渲染,传入模板依赖的
@fake_post变量:
<%= raw render_custom_erb(@post.frontend, fake_post: @fake_post) %>
重要安全提示
直接在服务端执行用户提交的Ruby代码属于极高风险操作,会导致远程代码执行(RCE)漏洞,攻击者可以通过构造恶意代码直接控制你的服务器、删除数据、窃取所有敏感信息。如果你的业务需要支持用户自定义动态逻辑,建议切换为前端JavaScript实现,或使用专用的Ruby沙箱环境隔离执行,避免直接执行未信任的用户代码。
内容的提问来源于stack exchange,提问作者Pradeep Rayapudi
相关产品推荐
相关产品推荐

