Skip to content

Commit 46faf27

Browse files
committed
fix: 修复安全漏洞并清理死代码
安全修复: - HandleActionController: 添加 is_subclass_of 校验,防止任意类实例化 - RenderableController: 添加 LazyRenderable 接口校验,防止任意类实例化 - TinymceController: 添加路径遍历防护和磁盘白名单校验 代码清理: - EloquentRepository: 移除 Laravel 5.8 兼容代码,直接使用 getForeignKeyName()
1 parent b382148 commit 46faf27

4 files changed

Lines changed: 29 additions & 5 deletions

File tree

src/Http/Controllers/HandleActionController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ protected function resolveActionInstance(Request $request): Action
4242

4343
$actionClass = str_replace('_', '\\', $request->get('_action'));
4444

45-
if (! class_exists($actionClass)) {
45+
if (! class_exists($actionClass) || ! is_subclass_of($actionClass, Action::class)) {
4646
throw new AdminException("Action [{$actionClass}] does not exist.");
4747
}
4848

src/Http/Controllers/RenderableController.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ protected function newRenderable(Request $request): LazyRenderable
5151

5252
$class = str_replace('_', '\\', $class);
5353

54+
if (! class_exists($class) || ! is_subclass_of($class, LazyRenderable::class)) {
55+
throw new \InvalidArgumentException("Renderable [{$class}] does not exist or does not implement LazyRenderable.");
56+
}
57+
5458
$renderable = new $class();
5559

5660
$renderable->payload($request->all());

src/Http/Controllers/TinymceController.php

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class TinymceController
1212
public function upload(Request $request)
1313
{
1414
$file = $request->file('file');
15-
$dir = trim($request->get('dir'), '/');
15+
$dir = $this->sanitizeDir($request->get('dir'));
1616
$disk = $this->disk();
1717

1818
$newName = $this->generateNewName($file);
@@ -27,13 +27,34 @@ protected function generateNewName(UploadedFile $file)
2727
return uniqid(md5($file->getClientOriginalName()), true).'.'.$file->getClientOriginalExtension();
2828
}
2929

30+
/**
31+
* Sanitize directory path to prevent path traversal.
32+
*/
33+
protected function sanitizeDir(?string $dir): string
34+
{
35+
$dir = trim($dir ?? '', '/');
36+
37+
// 移除路径遍历字符
38+
$dir = str_replace(['../', '..\\', '..'], '', $dir);
39+
40+
// 确保路径不以点开头(隐藏文件)
41+
$dir = ltrim($dir, '.');
42+
43+
return $dir ?: 'uploads';
44+
}
45+
3046
/**
3147
* @return \Illuminate\Contracts\Filesystem\Filesystem|FilesystemAdapter
3248
*/
3349
protected function disk()
3450
{
3551
$disk = request()->get('disk') ?: config('admin.upload.disk');
3652

53+
// 验证磁盘配置存在
54+
if (! config("filesystems.disks.{$disk}")) {
55+
$disk = config('admin.upload.disk', 'local');
56+
}
57+
3758
return Storage::disk($disk);
3859
}
3960
}

src/Repositories/EloquentRepository.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -872,9 +872,8 @@ protected function updateRelation(Form $form, EloquentModel $model, array $relat
872872
$parent->save();
873873

874874
// When in creating, associate two models
875-
$foreignKeyMethod = version_compare(app()->version(), '5.8.0', '<') ? 'getForeignKey' : 'getForeignKeyName';
876-
if (! $model->{$relation->{$foreignKeyMethod}()}) {
877-
$model->{$relation->{$foreignKeyMethod}()} = $parent->getKey();
875+
if (! $model->{$relation->getForeignKeyName()}) {
876+
$model->{$relation->getForeignKeyName()} = $parent->getKey();
878877

879878
$model->save();
880879
}

0 commit comments

Comments
 (0)