From d85bf37237e10f443e4e8434454623635630c9e5 Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Fri, 3 Jan 2025 10:34:52 -0300 Subject: [PATCH 01/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20erro=20500=20em=20r?= =?UTF-8?q?elatorios=5Fsocios.php=20[Issue=20#882]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/socio/sistema/relatorios_socios.php | 1 - 1 file changed, 1 deletion(-) diff --git a/html/socio/sistema/relatorios_socios.php b/html/socio/sistema/relatorios_socios.php index dd519dba..9dd2b8f1 100644 --- a/html/socio/sistema/relatorios_socios.php +++ b/html/socio/sistema/relatorios_socios.php @@ -1,6 +1,5 @@ Date: Fri, 3 Jan 2025 11:09:47 -0300 Subject: [PATCH 02/11] =?UTF-8?q?Altera=C3=A7=C3=A3o=20da=20mensagem=20de?= =?UTF-8?q?=20descri=C3=A7=C3=A3o=20do=20Pix=20[Issue=20#881]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/contribuicao/controller/ContribuicaoLogController.php | 6 +++++- html/contribuicao/service/PagarMePixService.php | 6 +++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/html/contribuicao/controller/ContribuicaoLogController.php b/html/contribuicao/controller/ContribuicaoLogController.php index 15b8e83c..7bb44cbe 100755 --- a/html/contribuicao/controller/ContribuicaoLogController.php +++ b/html/contribuicao/controller/ContribuicaoLogController.php @@ -452,7 +452,11 @@ public function criarQRCode() caso o serviço de pagamento tenha sido executado*/ $this->pdo->beginTransaction(); $contribuicaoLogDao = new ContribuicaoLogDAO($this->pdo); - $contribuicaoLogDao->criar($contribuicaoLog); + $contribuicaoLog = $contribuicaoLogDao->criar($contribuicaoLog); + + //Adicionar mensagem de agradecimento + $agradecimento = $contribuicaoLogDao->getAgradecimento(); + $contribuicaoLog->setAgradecimento($agradecimento); //Registrar na tabela de socio_log $mensagem = "Pix gerado recentemente"; diff --git a/html/contribuicao/service/PagarMePixService.php b/html/contribuicao/service/PagarMePixService.php index e524b87e..4c2e4b40 100644 --- a/html/contribuicao/service/PagarMePixService.php +++ b/html/contribuicao/service/PagarMePixService.php @@ -18,7 +18,7 @@ public function gerarQrCode(ContribuicaoLog $contribuicaoLog) } // Configuração dos dados para a API - $description = 'Doação'; + $description = $contribuicaoLog->getAgradecimento(); $expires_in = 3600; $headers = [ @@ -63,8 +63,8 @@ public function gerarQrCode(ContribuicaoLog $contribuicaoLog) 'expires_in' => $expires_in, 'additional_information' => [ [ - 'name' => 'Teste', - 'value' => '1' + 'name' => "Doação via pix", + 'value' => "{$contribuicaoLog->getValor()}" ] ] ] From 35d374736cec39082ed297bb3cd55fa6286050ad Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Fri, 3 Jan 2025 12:40:15 -0300 Subject: [PATCH 03/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20XSS=20[Issue=20#875?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../import_conteudo_editarsocios.php | 547 +++++++++--------- html/socio/sistema/editar_socio.php | 254 ++++---- 2 files changed, 419 insertions(+), 382 deletions(-) diff --git a/html/socio/sistema/controller/import_conteudo_editarsocios.php b/html/socio/sistema/controller/import_conteudo_editarsocios.php index 8e898e8d..42a525da 100755 --- a/html/socio/sistema/controller/import_conteudo_editarsocios.php +++ b/html/socio/sistema/controller/import_conteudo_editarsocios.php @@ -1,295 +1,320 @@ + +
- - - -
- - - + + + +
+ + + -
- +
+ - -
+ +
-
-

Editar sócio

-
-
+
+

Editar sócio

+
+
- - -
-
+ +
+
- + +
+
+ + +
+
+
+ + +
+ + +
-
- - -
-
-
- - -
- - -
-
-
-
- - -
-
- - -
-
- -
-
- - +
+
+ + +
+
+ +
+
+ + -
-
- - +
+
+ + -
-
- - -
- - -
- - -
-
-
-
- - -
-
- - -
-
-
-
- - +
+
+ + +
+ + +
+ + +
+
+
+
+ + +
+
+ + +
+
+
+
+ + -
-
-
-
- - - - - -
-
- -
-
-

Endereço

-
-
-
-
- -
- - + +
-
+
+
+ + + + + +
-
-
-
- - + +
+
+

Endereço

+
+
+
+
+ +
+ + +
+
-
- - -
-
-
-
- - +
+
+
+ +
-
- - -
-
-
-
- - +
+ + +
+
+
+
+ + +
+
+ +
-
- - +
+
+
+ + +
+
+ + +
+
+
+ Cancelar + +
+
+
-
-
- Cancelar - -
-
- +
- -
-
- -
-
-
+ + + + + + if (sociotipo >= 0 && sociotipo <= 13) { + console.log("boleto"); + } else if (sociotipo >= 10 && sociotipo <= 31) { + $("#tipo_contribuicao").val("2"); + console.log("cartão"); + } else { + $("#tipo_contribuicao").val("3"); + console.log("outro"); + } + \ No newline at end of file diff --git a/html/socio/sistema/editar_socio.php b/html/socio/sistema/editar_socio.php index 3065da63..23d0d7f6 100755 --- a/html/socio/sistema/editar_socio.php +++ b/html/socio/sistema/editar_socio.php @@ -1,159 +1,171 @@ + - - - Sócios - - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - + + + + - - + + - - + + - + - + - + - - + + - - - - - - - - + + + + + + + + - - + + - - + + - - + + - + - - - - - + + + + + + - + + \ No newline at end of file From 8369b75f88e64916151e5413a8b7d517d438d7a9 Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Mon, 6 Jan 2025 07:48:44 -0300 Subject: [PATCH 04/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20XSS=20[Issue=20#872?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/funcionario/pre_cadastro_funcionario.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/html/funcionario/pre_cadastro_funcionario.php b/html/funcionario/pre_cadastro_funcionario.php index 3cdb7af4..d21169b3 100644 --- a/html/funcionario/pre_cadastro_funcionario.php +++ b/html/funcionario/pre_cadastro_funcionario.php @@ -242,14 +242,14 @@
- '. $msg .' + '. htmlspecialchars($msg) .' '); }else if(isset($_GET['msg_e'])){ - $msg = $_GET['msg_e']; + $msg = filter_input(INPUT_GET, 'msg_e', FILTER_SANITIZE_STRING); echo(''); } ?> From 0b1b61348272d35564fd3d874b6a791217d5197f Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Mon, 6 Jan 2025 10:35:27 -0300 Subject: [PATCH 05/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20XSS=20[Issue=20#877?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sistema/controller/CobrancaController.php | 59 ++++++++++++++++--- 1 file changed, 52 insertions(+), 7 deletions(-) diff --git a/html/socio/sistema/controller/CobrancaController.php b/html/socio/sistema/controller/CobrancaController.php index f38ce761..cdb1be5e 100644 --- a/html/socio/sistema/controller/CobrancaController.php +++ b/html/socio/sistema/controller/CobrancaController.php @@ -12,9 +12,52 @@ /**Extrai os dados do formulário, instancia os objetos necessários e chama o método de inserirCobranca() do CobrancaDAO */ function cadastrarCobranca() { - extract($_REQUEST); - //print_r($_REQUEST); - //adicionar uma forma de gerar um código + + $socio_id = trim(filter_input(INPUT_POST, 'socio_id', FILTER_VALIDATE_INT)); + $local_recepcao = trim(filter_input(INPUT_POST, 'local_recepcao', FILTER_SANITIZE_STRING)); + $valor_cobranca = trim(filter_input(INPUT_POST, 'valor_cobranca', FILTER_SANITIZE_NUMBER_INT)); + $forma_doacao = trim(filter_input(INPUT_POST, 'forma_doacao', FILTER_SANITIZE_STRING)); + $data_doacao = trim(filter_input(INPUT_POST, 'data_doacao', FILTER_SANITIZE_STRING)); + $receptor = trim(filter_input(INPUT_POST, 'receptor', FILTER_SANITIZE_STRING)); + + if (!$socio_id || $socio_id < 1) { + http_response_code(400); + echo json_encode(['erro' => 'O id de um sócio deve ser um inteiro positivo maior ou igual a 1.']); + exit(); + } + + if (!$local_recepcao || strlen($local_recepcao) < 1) { + http_response_code(400); + echo json_encode(['erro' => 'Informe um local de recpção válido']); + exit(); + } + + if (!$valor_cobranca || $valor_cobranca < 0) { + http_response_code(400); + echo json_encode(['erro' => 'O valor de uma cobrança não pode ser negativo']); + exit(); + } + + if (!$forma_doacao || strlen($forma_doacao) < 1) { + http_response_code(400); + echo json_encode(['erro' => 'Informe uma forma de doação válida']); + exit(); + } + + $dataArray = explode('-', $data_doacao); + + if (!$data_doacao || !checkdate(intval($dataArray[1]), intval(($dataArray[2])), intval($dataArray[0]))) { + http_response_code(400); + echo json_encode(['erro' => 'A data de doação informada não é válida']); + exit(); + } + + if (!$receptor || strlen($receptor) < 1) { + http_response_code(400); + echo json_encode(['erro' => 'O receptor informado não possuí um documento válido']); + exit(); + } + $cobranca = new Cobranca(); $cobranca->setIdSocio($socio_id); $cobranca->setLocalRecepcao($local_recepcao); @@ -24,10 +67,12 @@ function cadastrarCobranca() $cobranca->setReceptor($receptor); $cobrancaDAO = new CobrancaDAO(); - try{ + try { $cobrancaDAO->inserirCobranca($cobranca); header('Location: ../cobrancas.php'); - }catch(PDOException $e){ - $e->getMessage(); - } + } catch (PDOException $e) { + http_response_code(500); + echo json_encode(['erro' => 'Erro no servidor ao registrar cobrança']); + exit(); + } } From 824e4c5b2c14d25fb60d7d1e4b29e6e2e8ee3c3e Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Mon, 6 Jan 2025 11:07:42 -0300 Subject: [PATCH 06/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20XSS=20[Issue=20#879?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/geral/modulos_visiveis.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/html/geral/modulos_visiveis.php b/html/geral/modulos_visiveis.php index a11f1818..dbcf3c30 100644 --- a/html/geral/modulos_visiveis.php +++ b/html/geral/modulos_visiveis.php @@ -176,13 +176,13 @@ - '. $msg .' + '. htmlspecialchars($msg) .' '); } if($permissao == 1){ - echo($msg." - ".$permissao); + echo(htmlspecialchars($msg)." - ".$permissao); }else{ ?>
From a61467602796213ec5928e3eedeed55dc3071273 Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Tue, 7 Jan 2025 07:27:19 -0300 Subject: [PATCH 07/11] =?UTF-8?q?Adi=C3=A7=C3=A3o=20do=20campo=20data=20de?= =?UTF-8?q?=20registro=20a=20tabela=20de=20resultados=20de=20um=20relat?= =?UTF-8?q?=C3=B3rio=20de=20entrada=20ou=20sa=C3=ADda=20[Issue=20#711]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/relatorio_geracao.php | 3 ++- html/relatorios/Relatorio_item.php | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/html/relatorio_geracao.php b/html/relatorio_geracao.php index 11779bd4..89d3927f 100755 --- a/html/relatorio_geracao.php +++ b/html/relatorio_geracao.php @@ -317,11 +317,12 @@ function quickQuery($query, $column) Quantidade Descrição Data de Registro'); echo ('Valor Unitário'); } else { echo ('Preço Médio'); } ?> - Total + Total diff --git a/html/relatorios/Relatorio_item.php b/html/relatorios/Relatorio_item.php index 74b5eaf3..bd7183d2 100755 --- a/html/relatorios/Relatorio_item.php +++ b/html/relatorios/Relatorio_item.php @@ -1,5 +1,6 @@ setQuery(" SELECT - SUM(ientrada.qtd) as qtd_total, produto.descricao, SUM(ientrada.qtd*ientrada.valor_unitario) as valor_total, ientrada.valor_unitario + SUM(ientrada.qtd) as qtd_total, produto.descricao, SUM(ientrada.qtd*ientrada.valor_unitario) as valor_total, ientrada.valor_unitario, entrada.data as data FROM ientrada LEFT JOIN produto ON produto.id_produto = ientrada.id_produto LEFT JOIN entrada ON entrada.id_entrada = ientrada.id_entrada @@ -96,9 +97,10 @@ private function entrada(){ }else{ $this->setQuery(" SELECT - SUM(ientrada.qtd) as qtd_total, produto.descricao, SUM(ientrada.qtd*ientrada.valor_unitario) as valor_total, ientrada.valor_unitario + SUM(ientrada.qtd) as qtd_total, produto.descricao, SUM(ientrada.qtd*ientrada.valor_unitario) as valor_total, ientrada.valor_unitario, entrada.data as data FROM ientrada LEFT JOIN produto ON produto.id_produto = ientrada.id_produto + LEFT JOIN entrada ON entrada.id_entrada = ientrada.id_entrada WHERE ientrada.qtd > 0 AND ientrada.oculto = false GROUP BY concat(ientrada.id_produto,ientrada.valor_unitario) ORDER BY produto.descricao @@ -138,7 +140,7 @@ private function saida(){ $this->setQuery(" SELECT - SUM(isaida.qtd) as qtd_total, produto.descricao, SUM(isaida.qtd*isaida.valor_unitario) as valor_total, isaida.valor_unitario + SUM(isaida.qtd) as qtd_total, produto.descricao, SUM(isaida.qtd*isaida.valor_unitario) as valor_total, isaida.valor_unitario, saida.data as data FROM isaida LEFT JOIN produto ON produto.id_produto = isaida.id_produto LEFT JOIN saida ON saida.id_saida = isaida.id_saida @@ -154,9 +156,10 @@ private function saida(){ }else{ $this->setQuery(" SELECT - SUM(isaida.qtd) as qtd_total, produto.descricao, SUM(isaida.qtd*isaida.valor_unitario) as valor_total, isaida.valor_unitario + SUM(isaida.qtd) as qtd_total, produto.descricao, SUM(isaida.qtd*isaida.valor_unitario) as valor_total, isaida.valor_unitario, saida.data as data FROM isaida LEFT JOIN produto ON produto.id_produto = isaida.id_produto + LEFT JOIN saida ON saida.id_saida = isaida.id_saida WHERE isaida.qtd > 0 AND isaida.oculto = false GROUP BY concat(isaida.id_produto,isaida.valor_unitario) ORDER BY produto.descricao @@ -285,10 +288,12 @@ public function display(){ '); }else{ + $util = new Util(); echo(' '.$item['qtd_total'].' '.$item['descricao'].' + '.$util->formatoDataDMY($item['data']).' R$ '.number_format($item['valor_unitario'],2).' R$ '.number_format($item['valor_total'],2).' From 7cffe707f584217c100817a4b42c172d307ed5e3 Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Tue, 7 Jan 2025 09:19:53 -0300 Subject: [PATCH 08/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20RCE=20[Issue=20#884?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sistema/controller/controla_xlsx.php | 55 +++++++++++-------- .../controller/controla_xlsx_cobranca.php | 25 ++++++--- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/html/socio/sistema/controller/controla_xlsx.php b/html/socio/sistema/controller/controla_xlsx.php index f54daf49..995a3e96 100755 --- a/html/socio/sistema/controller/controla_xlsx.php +++ b/html/socio/sistema/controller/controla_xlsx.php @@ -1,30 +1,41 @@ false, - "url"=> null - ); - if(!is_dir("../tabelas/")){ - if(mkdir("../tabelas")){ - mkdir("../tabelas/cobrancas/"); - } +//verificar privilégios do solicitante +session_start(); +require_once(dirname(__DIR__, 3) . '/permissao/permissao.php'); + +if (!isset($_SESSION['id_pessoa'])) { + http_response_code(401); + echo json_encode(['erro' => 'Acesso não autorizado, usuário não está logado.']); + exit(); +} + +permissao($_SESSION['id_pessoa'], 4, 3); + +$r = array( + "resultado" => false, + "url" => null +); +if (!is_dir("../tabelas/")) { + if (mkdir("../tabelas")) { + mkdir("../tabelas/cobrancas/"); } - if(!empty($_FILES['arquivo']['name'])){ - $bloqueados = array('php', 'exe', 'sh', 'bat', 'js', 'html', 'htm'); - $extensao = strtolower(pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION)); +} +if (!empty($_FILES['arquivo']['name'])) { + $permitidos = array('xlsx'); + $extensao = strtolower(pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION)); - if (!in_array($extensao, $bloqueados)) { - $file_name = preg_replace("/[^a-zA-Z0-9\._-]/", "_", basename($_FILES['arquivo']['name'])); + if (in_array($extensao, $permitidos)) { + $file_name = preg_replace("/[^a-zA-Z0-9\._-]/", "_", basename($_FILES['arquivo']['name'])); - if (move_uploaded_file($_FILES['arquivo']['tmp_name'], "../tabelas/".$file_name)) { - $r['resultado'] = true; - $r['url'] = "./tabelas/".htmlspecialchars($file_name, ENT_QUOTES, 'UTF-8'); - } else { - $r['url'] = "Erro ao mover o arquivo."; - } + if (move_uploaded_file($_FILES['arquivo']['tmp_name'], "../tabelas/" . $file_name)) { + $r['resultado'] = true; + $r['url'] = "./tabelas/" . htmlspecialchars($file_name, ENT_QUOTES, 'UTF-8'); } else { - $r['url'] = "Tipo de arquivo não permitido."; + $r['url'] = "Erro ao mover o arquivo."; } + } else { + $r['url'] = "Tipo de arquivo não permitido."; } +} - echo(json_encode($r)) -?> \ No newline at end of file +echo (json_encode($r)); diff --git a/html/socio/sistema/controller/controla_xlsx_cobranca.php b/html/socio/sistema/controller/controla_xlsx_cobranca.php index a6510b1c..1a056e34 100755 --- a/html/socio/sistema/controller/controla_xlsx_cobranca.php +++ b/html/socio/sistema/controller/controla_xlsx_cobranca.php @@ -1,7 +1,19 @@ 'Acesso não autorizado, usuário não está logado.']); + exit(); +} + +permissao($_SESSION['id_pessoa'], 4, 3); + $r = array( - "resultado"=> false, - "url"=> null + "resultado" => false, + "url" => null ); if (!is_dir("../tabelas/")) { @@ -11,15 +23,15 @@ } if (!empty($_FILES['arquivo']['name'])) { - $bloqueados = array('php', 'exe', 'sh', 'bat', 'js', 'html', 'htm'); + $permitidos = array('xlsx'); $extensao = strtolower(pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION)); - if (!in_array($extensao, $bloqueados)) { + if (in_array($extensao, $permitidos)) { $file_name = preg_replace("/[^a-zA-Z0-9\._-]/", "_", basename($_FILES['arquivo']['name'])); - if (move_uploaded_file($_FILES['arquivo']['tmp_name'], "../tabelas/cobrancas/".$file_name)) { + if (move_uploaded_file($_FILES['arquivo']['tmp_name'], "../tabelas/cobrancas/" . $file_name)) { $r['resultado'] = true; - $r['url'] = "./tabelas/cobrancas/".$file_name; + $r['url'] = "./tabelas/cobrancas/" . htmlspecialchars($file_name); } else { $r['url'] = "Erro ao mover o arquivo."; } @@ -29,4 +41,3 @@ } echo json_encode($r); -?> From 9fe6a726ec116471f4459a396bcb8504a8aec3d0 Mon Sep 17 00:00:00 2001 From: GabrielPintoSouza Date: Tue, 7 Jan 2025 09:57:22 -0300 Subject: [PATCH 09/11] =?UTF-8?q?Adi=C3=A7=C3=A3o=20de=20redirecionamento?= =?UTF-8?q?=20para=20acessos=20a=20raiz=20da=20pasta=20tabela=20do=20m?= =?UTF-8?q?=C3=B3dulo=20de=20s=C3=B3cios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + html/socio/sistema/tabelas/index.php | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 html/socio/sistema/tabelas/index.php diff --git a/.gitignore b/.gitignore index 037d1ff3..d74f1823 100755 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ config.php BD/.idea/ html/contribuicao/pdfs/ +html/socio/sistema/tabelas/ diff --git a/html/socio/sistema/tabelas/index.php b/html/socio/sistema/tabelas/index.php new file mode 100644 index 00000000..00cfbf5d --- /dev/null +++ b/html/socio/sistema/tabelas/index.php @@ -0,0 +1,4 @@ + Date: Tue, 7 Jan 2025 11:18:21 -0300 Subject: [PATCH 10/11] =?UTF-8?q?Resolu=C3=A7=C3=A3o=20XSS=20[Issue=20#886?= =?UTF-8?q?]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/geral/listar_permissoes.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/html/geral/listar_permissoes.php b/html/geral/listar_permissoes.php index 6014a796..9b991ac4 100755 --- a/html/geral/listar_permissoes.php +++ b/html/geral/listar_permissoes.php @@ -161,14 +161,14 @@
- '. $msg .' + '. htmlspecialchars($msg) .'
'); }else if(isset($_GET['msg_e'])){ - $msg = $_GET['msg_e']; + $msg = trim(filter_input(INPUT_GET, 'msg_e', FILTER_SANITIZE_STRING)); echo(''); } ?> From 330f641db43cfb0c8ea8bb6025cc0732de4d4d6b Mon Sep 17 00:00:00 2001 From: Nilson Lazarin Date: Tue, 7 Jan 2025 11:23:17 -0300 Subject: [PATCH 11/11] =?UTF-8?q?Ajustes=20de=20seguran=C3=A7a=20https://g?= =?UTF-8?q?ithub.com/nilsonLazarin/WeGIA/security/advisories/GHSA-h8hr-jhc?= =?UTF-8?q?x-fcv9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- html/socio/sistema/controller/.htaccess | 5 + .../sistema/controller/controla_xlsx.php | 101 +++++++++++++----- 2 files changed, 81 insertions(+), 25 deletions(-) create mode 100644 html/socio/sistema/controller/.htaccess diff --git a/html/socio/sistema/controller/.htaccess b/html/socio/sistema/controller/.htaccess new file mode 100644 index 00000000..1087b673 --- /dev/null +++ b/html/socio/sistema/controller/.htaccess @@ -0,0 +1,5 @@ + + SetHandler none + SetHandler default-handler + Options -ExecCGI + \ No newline at end of file diff --git a/html/socio/sistema/controller/controla_xlsx.php b/html/socio/sistema/controller/controla_xlsx.php index f54daf49..edc3fdd0 100755 --- a/html/socio/sistema/controller/controla_xlsx.php +++ b/html/socio/sistema/controller/controla_xlsx.php @@ -1,30 +1,81 @@ false, - "url"=> null - ); - if(!is_dir("../tabelas/")){ - if(mkdir("../tabelas")){ - mkdir("../tabelas/cobrancas/"); - } +// Inicializa a resposta padrão +$r = array( + "resultado" => false, + "mensagem" => "Ocorreu um erro ao processar o arquivo." +); + +// Diretório seguro para armazenamento de arquivos +$diretorio = "../tabelas/"; + +// Cria os diretórios necessários, se não existirem +if (!is_dir($diretorio)) { + if (!mkdir($diretorio, 0755, true)) { + $r['mensagem'] = "Erro ao criar diretório de upload."; + echo json_encode($r); + exit; + } +} + +if (!empty($_FILES['arquivo']['name'])) { + // Lista de extensões e tipos MIME permitidos + $extensoesPermitidas = array('jpg', 'jpeg', 'png', 'gif'); + $tiposMimePermitidos = array('image/jpeg', 'image/png', 'image/gif'); + + // Obtém o nome e extensão do arquivo + $file_name_original = basename($_FILES['arquivo']['name']); + $extensao = strtolower(pathinfo($file_name_original, PATHINFO_EXTENSION)); + + // Verifica se a extensão é permitida + if (!in_array($extensao, $extensoesPermitidas)) { + $r['mensagem'] = "Extensão de arquivo não permitida."; + echo json_encode($r); + exit; } - if(!empty($_FILES['arquivo']['name'])){ - $bloqueados = array('php', 'exe', 'sh', 'bat', 'js', 'html', 'htm'); - $extensao = strtolower(pathinfo($_FILES['arquivo']['name'], PATHINFO_EXTENSION)); - - if (!in_array($extensao, $bloqueados)) { - $file_name = preg_replace("/[^a-zA-Z0-9\._-]/", "_", basename($_FILES['arquivo']['name'])); - - if (move_uploaded_file($_FILES['arquivo']['tmp_name'], "../tabelas/".$file_name)) { - $r['resultado'] = true; - $r['url'] = "./tabelas/".htmlspecialchars($file_name, ENT_QUOTES, 'UTF-8'); - } else { - $r['url'] = "Erro ao mover o arquivo."; - } - } else { - $r['url'] = "Tipo de arquivo não permitido."; - } + + // Obtém o tipo MIME do arquivo + $finfo = finfo_open(FILEINFO_MIME_TYPE); + $tipoMime = finfo_file($finfo, $_FILES['arquivo']['tmp_name']); + finfo_close($finfo); + + // Verifica se o tipo MIME é permitido + if (!in_array($tipoMime, $tiposMimePermitidos)) { + $r['mensagem'] = "Tipo de arquivo inválido."; + echo json_encode($r); + exit; + } + + // Sanitiza e gera um nome de arquivo único + $file_name_sanitized = preg_replace("/[^a-zA-Z0-9\._-]/", "_", pathinfo($file_name_original, PATHINFO_FILENAME)); + $file_name = uniqid() . "_" . $file_name_sanitized . '.' . $extensao; + + // Verifica se o arquivo já existe (mesmo com nomes únicos, esta é uma garantia extra) + $destino = $diretorio . $file_name; + if (file_exists($destino)) { + $r['mensagem'] = "Um arquivo com o mesmo nome já existe."; + echo json_encode($r); + exit; + } + + // Verifica se o arquivo é realmente uma imagem válida + if (!getimagesize($_FILES['arquivo']['tmp_name'])) { + $r['mensagem'] = "O arquivo enviado não é uma imagem válida."; + echo json_encode($r); + exit; + } + + // Move o arquivo para o diretório seguro + if (move_uploaded_file($_FILES['arquivo']['tmp_name'], $destino)) { + $r['resultado'] = true; + $r['mensagem'] = "Upload realizado com sucesso."; + $r['url'] = "./tabelas/" . urlencode($file_name); // Codifica a URL para evitar problemas + } else { + $r['mensagem'] = "Erro ao mover o arquivo para o diretório de destino."; } +} else { + $r['mensagem'] = "Nenhum arquivo foi enviado."; +} - echo(json_encode($r)) +// Retorna a resposta em JSON +echo json_encode($r); ?> \ No newline at end of file