允许用户创建自定义边栏选项卡布局/存储在数据库中


Let users create custom blade layouts / store in database

问题:我需要让我的 Web 应用用户创建自己的边栏选项卡布局模板。因此,最方便的解决方案是将刀片模板存储到数据库中。但是,我没有看到从blade file中的布局代码NOT SPECIFIED extendview的方法。此外,下一个问题是安全问题。我不能依靠用户插入safe code.允许插入php代码或直接blade代码对系统来说是灾难性的。那怎么办?

  1. 将布局模板保存在数据库中
  2. 确保没有代码部分在服务器端执行。

作为旁注,我可以让用户在代码中提及预先指定的标记,这些标记应替换为系统的结果。

解决方案 1:让用户填充数据库列(在过滤给定代码以获取任何可能的 php 代码后)并将其保存到"master"文件中,从该文件扩展最终视图。用户可以使用给定的代码进行内容替换

//master.blade.php
<html>
<head>
<%token%>
</head>
<body>
<%content%>
...
<%scripts%>
</body>
</html>

在上面的代码中,<%的内容%>

应替换为

@yield("内容")

在处理实际视图之前。

//final.blade.php
@extends('layouts.master')
@section('content')
...
@endsection

因此,控制器将数据库列内容保存到 master.blade 中.php然后根据需要调用 view('final') 函数。

//In Controller
//Save the contents of database column in master.blade.php
return view('final',$data);

这不是一个好的解决方案。每个请求的文件写入操作、缓存问题、安全问题(如服务端执行脚本注入)等。另一种方法是为每个用户提供一个主控形状,该主控形状仅在用户在模板列中进行更改时创建。从而受益于较少的文件写入操作,但是由于文件系统中的每个用户都有一个文件,因此

服务器上的文件过载。

解决方案 2:将用户的布局代码保存到数据库列中(无需筛选)。

//In controller
$content = View::make('final',compact('data'));
$token = "<meta name='_token' content='" . csrf_token() ."'";
$scripts = View::make('final_scripts',compact('data'));
$view = str_replace_first("<%content%>", $content, $templateInDatabase);
$view = str_replace_first("<%token%>", $token, $view);
$view = str_replace_first("<%scripts%>", $scripts, $view);
return $view;

应使用户在模板代码中包含三个 <%X%> 标签。好处是无需服务器端代码执行,因此增加了安全性。缓存问题最小化,因为可以缓存最终final_scripts刀片模板。但是字符串替换会增加额外的工作量。