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
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()
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
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á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
Eu comprei um modulo original na Open Cart para o modulo de venda do meu site e foi resolvido https://hootersbrasil.com.br/
Who is online
Users browsing this forum: No registered users and 1 guest