Написание системы плагинов PHP с ограниченным доступом к системе
Поэтому я думаю о создании CMS, и я хотел бы, чтобы он был спроектирован так, чтобы плагины могли легко расширять его функциональность (я также работаю над системой ловушек и настройкой языка).
Вот сложная часть: вместо того, чтобы индивидуально упаковывать CMS, я пытаюсь создать своего рода хост для многих сайтов (например, mycms.com/your-site).
Я проектирую базу данных MySQL с такой структурой:
pages
- id
- slug
- title
- content
- site // The site id
sites
- id
- path // e.g. your-site
- password // hash
Затем я буду хранить такие плагины в файловой структуре:
plugins/
42/ // Site id
hello-world/ // plugin name
hello-world.php
functions.php
css/ // ...
Конечно, здесь есть серьезная проблема безопасности. Скажем, автор плагина кодирует hello-world.php примерно так:
<?php
include '../../../core/config.inc.php';
echo $config['mysql']['password']; // Now they have my server's database password!
?>
Как мне обойти что-то подобное? Как я могу управлять этим, чтобы hello-world.php имел доступ только к файлам в каталоге hello-world / и ничего над ним? По сути, я хочу запретить плагинам доступ к файлам вне их собственного каталога.
Это должно быть просто, верно?
Спасибо!
1 ответ
Учтите, что эти плагины будут в конечном итоге запускаться в процессе cms, поэтому вредоносный плагин может очищать данные даже из глобальной области действия процесса. Ваш cms, скорее всего, в какой-то момент будет включать config.php, что означает, что настройки теперь находятся в глобальной области видимости и могут быть прочитаны любым кодом. Вы можете обойти это, сохраняя настройки в функции, например. Вы получаете доступ к этим настройкам, запрашивая возвращаемое значение функции и изобретая какой-то механизм блокировки вызовов функций.