src/config/config.phpAlterações necessárias:
<?php
// ❌ DESENVOLVIMENTO (REMOVER)
// define('DB_HOST', 'localhost');
// define('DB_USER', 'root');
// define('DB_PASS', 'root');
// define('BASE_URL', 'http://localhost:8888/gabinete');
// ✅ PRODUÇÃO (CONFIGURAR)
define('DB_HOST', 'SEU_HOST_BANCO'); // Ex: mysql.seudominio.com
define('DB_USER', 'SEU_USUARIO_BANCO'); // Ex: gabinete_user
define('DB_PASS', 'SUA_SENHA_SEGURA'); // Senha forte do banco
define('DB_NAME', 'gabinete_bd'); // Nome do banco (manter)
define('BASE_URL', 'https://seudominio.com'); // Sua URL de produção
// Fuso Horário (manter)
date_default_timezone_set('America/Belem');
// ❌ REMOVER CONFIGURAÇÕES DE DESENVOLVIMENTO
// error_reporting(E_ALL);
// ini_set('display_errors', 1);
// ✅ CONFIGURAÇÕES DE PRODUÇÃO
error_reporting(0);
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/php_errors.log');
?>
contas/db.phpLinha 9: Alterar configurações de conexão
// ❌ DESENVOLVIMENTO
$DB_HOST = defined('DB_HOST') ? DB_HOST : (getenv('DB_HOST') ?: 'localhost');
$DB_PORT = defined('DB_PORT') ? DB_PORT : (getenv('DB_PORT') !== false ? intval(getenv('DB_PORT')) : 8889);
// ✅ PRODUÇÃO
$DB_HOST = defined('DB_HOST') ? DB_HOST : (getenv('DB_HOST') ?: 'SEU_HOST_BANCO');
$DB_PORT = defined('DB_PORT') ? DB_PORT : (getenv('DB_PORT') !== false ? intval(getenv('DB_PORT')) : 3306);
contas/index.phpLinha 310: Alterar link de navegação
<!-- ❌ DESENVOLVIMENTO -->
<a href="http://localhost:8888/gabinete/" class="nav-link nav-primary nav-push-right">
<!-- ✅ PRODUÇÃO -->
<a href="https://seudominio.com/" class="nav-link nav-primary nav-push-right">
contas/relatorios.phpLinhas 223, 235: Alterar links de navegação
<!-- ❌ DESENVOLVIMENTO -->
<a href="http://localhost:8888/gabinete/" class="nav-link nav-primary nav-push-right">
<!-- ✅ PRODUÇÃO -->
<a href="https://seudominio.com/" class="nav-link nav-primary nav-push-right">
contas/contas.phpLinha 234: Alterar link de navegação
<!-- ❌ DESENVOLVIMENTO -->
<a href="http://localhost:8888/gabinete/" class="nav-link nav-home nav-push-right">
<!-- ✅ PRODUÇÃO -->
<a href="https://seudominio.com/" class="nav-link nav-home nav-push-right">
# Segurança Geral
ServerTokens Prod
ServerSignature Off
# Proteção contra ataques
<IfModule mod_headers.c>
Header always set X-Content-Type-Options nosniff
Header always set X-Frame-Options DENY
Header always set X-XSS-Protection "1; mode=block"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';"
</IfModule>
# Bloquear acesso a arquivos sensíveis
<Files ~ "\.(log|sql|md|txt)$">
Order allow,deny
Deny from all
</Files>
# Bloquear acesso a diretórios de configuração
<DirectoryMatch "/(config|logs|sql)/">
Order allow,deny
Deny from all
</DirectoryMatch>
# Redirecionar HTTP para HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# uploads/.htaccess
<Files ~ "\.(php|php3|php4|php5|phtml|pl|py|jsp|asp|sh|cgi)$">
Order allow,deny
Deny from all
</Files>
# src/.htaccess
Order allow,deny
Deny from all
-- Conectar como root e executar:
CREATE USER 'gabinete_user'@'%' IDENTIFIED BY 'SENHA_FORTE_AQUI';
GRANT SELECT, INSERT, UPDATE, DELETE ON gabinete_bd.* TO 'gabinete_user'@'%';
FLUSH PRIVILEGES;
# Upload do arquivo gabinete_bd.sql via phpMyAdmin ou linha de comando
mysql -u gabinete_user -p gabinete_bd < gabinete_bd.sql
# Permissões recomendadas
chmod 755 /caminho/para/gabinete/
chmod 644 /caminho/para/gabinete/*.php
chmod 755 /caminho/para/gabinete/uploads/
chmod 755 /caminho/para/gabinete/src/logs/
chmod 600 /caminho/para/gabinete/src/config/config.php
# .env
DB_HOST=seu_host_banco
DB_USER=gabinete_user
DB_PASS=sua_senha_forte
DB_NAME=gabinete_bd
BASE_URL=https://seudominio.com
ENVIRONMENT=production
<?php
// Carregar variáveis de ambiente
if (file_exists(__DIR__ . '/../../.env')) {
$env = parse_ini_file(__DIR__ . '/../../.env');
foreach ($env as $key => $value) {
$_ENV[$key] = $value;
}
}
// Configurações usando variáveis de ambiente
define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost');
define('DB_USER', $_ENV['DB_USER'] ?? 'root');
define('DB_PASS', $_ENV['DB_PASS'] ?? '');
define('DB_NAME', $_ENV['DB_NAME'] ?? 'gabinete_bd');
define('BASE_URL', $_ENV['BASE_URL'] ?? 'http://localhost');
// Configurações baseadas no ambiente
if (($_ENV['ENVIRONMENT'] ?? 'development') === 'production') {
error_reporting(0);
ini_set('display_errors', 0);
} else {
error_reporting(E_ALL);
ini_set('display_errors', 1);
}
?>
// Adicionar ao config.php
ini_set('log_errors', 1);
ini_set('error_log', __DIR__ . '/../logs/php_errors.log');
# Adicionar ao crontab do servidor
0 0 * * 0 find /caminho/para/gabinete/src/logs/ -name "*.log" -mtime +30 -delete
#!/bin/bash
# backup_gabinete.sh
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_DIR="/caminho/para/backups"
mysqldump -u gabinete_user -p'SENHA' gabinete_bd > $BACKUP_DIR/gabinete_$DATE.sql
gzip $BACKUP_DIR/gabinete_$DATE.sql
# Manter apenas backups dos últimos 30 dias
find $BACKUP_DIR -name "gabinete_*.sql.gz" -mtime +30 -delete
src/config/config.phpcontas/.htaccess de segurançaconfig.phpuploads/upload_max_filesize no PHPBASE_URL no config.php.htaccess está configurado