Post by maa » Sun Apr 11, 2010 8:12 pm

Olá pessoal!!!

Encontrei uma falha de segurança no boleto Bradesco:
Todos os boletos emitidos em sua loja virtual estão acessíveis para qualquer um na internet!!!

Exemplo:
http://www.seusite.com.br/opencart/inde ... order_id=8

No link acima, basta mudar o order_id para o registro que se deseja visualizar e o boleto correspondente é exibido, mesmo que o usuário não esteja logado, e ainda mostra todos os boletos de todos os usuários da loja virtual.

Não testei os módulos de boletos para os outros bancos, mas é recomendável que todos revisem suas lojas!!!

Vejo 2 prováveis formas para a correção:
1) Não permitir a visualização sem antes o usuário logar, e mesmo depois de logado verificar se o boleto pertence ao usuário.
2) Usar o order_id criptografado, como deve ter sido a intenção de quem escreveu o código original. Mas não é o que está ocorrendo. O order_id está sendo criado sequencialmente a partir do número 1.

Na minha opinião, a primeira opção é a mais segura, e é nela que estou trabalhando.

Eu conheço um pouco de PHP, e estou tentando implantar minha primeira loja virtual. Tenho um pouco de dificuldade porque ainda não conheço muito bem a estrutura de programação do OpenCart, e agradeceria se alguém puder ajudar em:
a) Como verificar se o usuário está logado?
b) Como verificar se o boleto q está sendo solicitado pertence realmente ao usuário?

Dúvida importante!!! Como informar esta falha de segurança para o OpenCart internacional???
Se este módulo de pagamento via boleto foi derivado de algum outro módulo de pagamento utilizado pelo OpenCart, é muito provável que este módulo original e outros que tenham sido dele derivado estejam com o mesmo problema!!!
I) Como podemos encontrar e informar o autor do módulo original sobre esta falha?
II) Alguém saberia me dizer se outros países utilizam boletos de pagamento?
III) Como se traduz "boleto de pagamento bancário" para o inglês? Assim eu poderia escrever um post para toda a comunidade.

Qualquer dúvida, estarei à disposição.


Estou usando a versão: OpenCart 1.4.4
Da página:
http://www.opencart.com/index.php?route ... ion_id=424
Estou usando o módulo:
http://www.opencart.com/index.php?route ... ion_id=689



Abs,
Marcos Maa

maa
Newbie

Posts

Joined
Fri Apr 09, 2010 1:02 am

Post by maa » Mon Apr 19, 2010 8:23 pm

Olá!


Consegui concluir parte da correção!!!

Com estar correção, os boletos apenas são visíveis pelos seus próprios compradores da loja, e mesmo assim estes devem estar logados.

Falta fazer:
- Admin ainda não consegue visualizar os boletos dos compradores da loja para gerar a 2a. via.

Como instalar a correção:
No arquivo catalog/controller/payment/boleto_bradesco.php, substituir a função callback() pela correção abaixo:

Arquivo: catalog/controller/payment/boleto_bradesco.php
Função: callback()

Code: Select all

	public function callback() {
		if (!$this->customer->isLogged()) {
			if (isset($this->request->get['order_id'])) {
				$order_id = $this->request->get['order_id'];
			} else {
				$order_id = 0;
			}	
			
			$this->session->data['redirect'] = HTTPS_SERVER . 'index.php?route=payment/boleto_bradesco/callback&order_id' . $order_id;
			
			$this->redirect(HTTPS_SERVER . 'index.php?route=account/login');
	    	}

		$this->load->library('encryption');

		$encryption = new Encryption($this->config->get('config_encryption'));

		$order_id = $encryption->decrypt(@$this->request->get['order_id']);


		$this->load->model('account/order');		

		$order_info = $this->model_account_order->getOrder($order_id);

		if ($order_info) {
		

			$this->load->model('checkout/order');
			$order_info = $this->model_checkout_order->getOrder($order_id);
		

			if ($order_info) {

				//############################## inicio configuração do boleto #################////	

				// DADOS DO BOLETO PARA O SEU CLIENTE

				$dias_de_prazo_para_pagamento = $this->config->get('boleto_bradesco_dia_prazo_pg');

				$taxa_boleto =$this->config->get('boleto_bradesco_taxa_boleto');

				$data_venc = date("d/m/Y", time() + ($dias_de_prazo_para_pagamento * 86400));  // Prazo de X dias OU informe data: "13/04/2006";

				$valor_cobrado = $order_info['total']; // Valor - REGRA: Sem pontos na milhar e tanto faz com "." ou "," ou com 1 ou 2 ou sem casa decimal

				$valor_cobrado = str_replace(",", ".",$valor_cobrado);

				$valor_boleto=number_format($valor_cobrado+$taxa_boleto, 2, ',', '');



				// Composição Nosso Numero - CEF SIGCB

				$dadosboleto["nosso_numero"] = str_pad($order_info['order_id']+$this->config->get('boleto_bradesco_nosso_numero'), 5, "0", STR_PAD_LEFT); // tamanho 3







				$dadosboleto["numero_documento"] = str_pad($order_info['order_id'], 11, "0", STR_PAD_LEFT);;	// Num do pedido ou do documento

				$dadosboleto["data_vencimento"] = $data_venc; // Data de Vencimento do Boleto - REGRA: Formato DD/MM/AAAA

				$dadosboleto["data_documento"] = date("d/m/Y"); // Data de emissão do Boleto

				$dadosboleto["data_processamento"] = date("d/m/Y"); // Data de processamento do boleto (opcional)

				$dadosboleto["valor_boleto"] = $valor_boleto; 	// Valor do Boleto - REGRA: Com vírgula e sempre com duas casas depois da virgula



				// DADOS DO SEU CLIENTE

				$dadosboleto["sacado"] = $order_info['payment_firstname']." ".$order_info['payment_lastname'];

				$dadosboleto["endereco1"] = $order_info['payment_address_1']." ".$order_info['payment_address_2'];

				$dadosboleto["endereco2"] = $order_info['payment_city']."-".$order_info['payment_zone']."- CEP:".$order_info['payment_postcode'];



				// INFORMACOES PARA O CLIENTE

				$dadosboleto["demonstrativo1"] = $this->config->get('boleto_bradesco_demonstrativo1');

				$dadosboleto["demonstrativo2"] = $this->config->get('boleto_bradesco_demonstrativo2')."<br>Taxa banc&aacute;ria - R$ ".number_format($taxa_boleto, 2, ',', '');

				$dadosboleto["demonstrativo3"] = $this->config->get('boleto_bradesco_demonstrativo3');



				// INSTRUÇÕES PARA O CAIXA

				$dadosboleto["instrucoes1"] = $this->config->get('boleto_bradesco_instrucoes1');

				$dadosboleto["instrucoes2"] = $this->config->get('boleto_bradesco_instrucoes2');

				$dadosboleto["instrucoes3"] = $this->config->get('boleto_bradesco_instrucoes3');

				$dadosboleto["instrucoes4"] = $this->config->get('boleto_bradesco_instrucoes4');



				// DADOS OPCIONAIS DE ACORDO COM O BANCO OU CLIENTE

				$dadosboleto["quantidade"] = $this->config->get('boleto_bradesco_quantidade');

				$dadosboleto["valor_unitario"] = $this->config->get('boleto_bradesco_unitario');

				$dadosboleto["aceite"] = $this->config->get('boleto_bradesco_aceite');;	

				$dadosboleto["especie"] = $this->config->get('boleto_bradesco_especie');

				$dadosboleto["especie_doc"] = $this->config->get('boleto_bradesco_especie_doc');





				// ---------------------- DADOS FIXOS DE CONFIGURAÇÃO DO SEU BOLETO --------------- //





				// DADOS DA SUA CONTA - Bradesco

				$dadosboleto["agencia"] = $this->config->get('boleto_bradesco_agencia'); // Num da agencia, sem digito

				$dadosboleto["agencia_dv"] = $this->config->get('boleto_bradesco_agencia_digito'); // Digito do Num da agencia

				$dadosboleto["conta"] = $this->config->get('boleto_bradesco_conta'); 	// Num da conta, sem digito

				$dadosboleto["conta_dv"] = $this->config->get('boleto_bradesco_conta_digito'); 	// Digito do Num da conta



				// DADOS PERSONALIZADOS - Bradesco

				$dadosboleto["conta_cedente"] = $this->config->get('boleto_bradesco_conta'); // ContaCedente do Cliente, sem digito (Somente Números)

				$dadosboleto["conta_cedente_dv"] = $this->config->get('boleto_bradesco_conta_digito'); // Digito da ContaCedente do Cliente

				$dadosboleto["carteira"] = $this->config->get('boleto_bradesco_carteira');  // Código da Carteira: pode ser 06 ou 03



				// SEUS DADOS

				$dadosboleto["identificacao"] = $this->config->get('boleto_bradesco_identificacao');

				$dadosboleto["cpf_cnpj"] = $this->config->get('boleto_bradesco_cpf_cnpj');

				$dadosboleto["endereco"] = $this->config->get('boleto_bradesco_endereco');

				$dadosboleto["cidade_uf"] = $this->config->get('boleto_bradesco_cidade_uf');

				$dadosboleto["cedente"] = $this->config->get('boleto_bradesco_cedente');

				$dadosboleto["empresa_logo"] = $this->config->get('boleto_bradesco_logo');



				// NÃO ALTERAR!

				ob_start();

				include("boleto/include/funcoes_bradesco.php");

				$ouput = include("boleto/include/layout_bradesco.php");	

				//########################FIM CONFIGURAÇÃO DO BOLETO ################################//	

			} else {

				//erro ao gera boleto

				$ouput = "<script>

					       alert(\"Atencao!\\n \\nBoleto bancario nao encontrado!\\n \\nEntre em contato com nosso atendimento.\\n \\nVocê sera redirecionado para a Central do Cliente.\");

						 window.location = 'index.php?route=information/contact';

					 </script>";  

	

			}

		}
		else
		{
			//erro ao gera boleto

			$ouput = "<script>

				       alert(\"Atencao!\\n \\nBoleto bancario nao encontrado!\\n \\nEntre em contato com nosso atendimento.\\n \\nVocê sera redirecionado para a Central do Cliente.\");

					 window.location = 'index.php?route=information/contact';

				 </script>";  

		}
		

		

		$this->response->setOutput($ouput);

	}

Por favor, testem antes de colocar em produção. Esta é minha primeira correção no código do OpenCart, e o meu código pode conter erros.

Espero ter ajudado.

Abs,
Marcos Maa

maa
Newbie

Posts

Joined
Fri Apr 09, 2010 1:02 am

Post by chags » Tue Jul 09, 2013 9:05 am

amigo

você teria esse modulo funcionando na versão d opencart 1.5.5.1?

eu ficaria agradecido..

pois a que tenho o boleto fica em branco

Newbie

Posts

Joined
Tue Jul 09, 2013 8:59 am

Post by gr3websites » Fri Dec 30, 2022 1:22 am

Eu comprei um modulo original na Open Cart para o modulo de venda do meu site e foi resolvido https://hootersbrasil.com.br/

Newbie

Posts

Joined
Sun Oct 25, 2020 7:19 am
Who is online

Users browsing this forum: No registered users and 1 guest