Impedir que a mensagem de erro mostre o SQL


10

Na minha tabela, criei um índice em 'col1' para evitar entradas duplicadas, o que funciona bem, mas a mensagem de erro resultante exibida ao usuário quando ele tenta adicionar uma entrada duplicada parece-me uma preocupação de segurança, pois exibe o SQL incluindo o prefixo da tabela.

Existe alguma maneira de impedir que o Joomla exiba o SQL na mensagem de erro?

Eu tentei alterar as configurações de relatório de erros na configuração global, mas não tem efeito, tanto quanto eu posso dizer ...

Mensagem de exemplo:

Erro

Falha ao salvar com o seguinte erro: Entrada duplicada 'Test' para a chave 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` ordering`, `state`,` created_by`) VALUES ('0' , 'Teste', '2', '1', '730')


1
Eu sou novo no Joomla, mas você está absolutamente certo, qualquer erro na área do usuário em um ambiente de produção não deve conter nenhum SQL. Não apenas por segurança, mas porque não faz sentido para os usuários e oferece uma experiência ruim ao usuário. Em um ambiente de produção, display_errors(configuração do PHP) deve estar desativada e esses erros devem ser registrados apenas no log de erros do lado do servidor.
MrWhite

Apenas curioso, você provavelmente já verificou isso, mas não possui configurações de depuração ativadas, certo? Verifique: Configuração global> configuração do sistema de depuração. Verifique: Configuração global> Nível de relatório de erros. Verifique: Plugins> Debug plugin Apenas curioso para saber se algo está acontecendo. Eu pergunto porque estava lendo isso learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle

@ChadWindnagle Hi Chad, sim eu tentei transformar isso em off, mas sem efeito ...
doovers

desculpe, acabou de editar, você pode me informar que viu o conteúdo atualizado? thnx!
Chad Windnagle

@ChadWindnagle Não, eu não tinha visto sua edição! Tentei relatar erros, mas esqueci de desativar o plug-in (obrigado pela dica), que acabei de tentar agora, mas ainda sem efeito!
doovers 14/05

Respostas:


6

Talvez você possa usar um comando try catch:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}

Obrigado pela sugestão, mas desde que eu estava usando JTablea melhor solução foi substituir o checkmétodo como na minha resposta.
doovers 14/05

Esta é uma boa resposta
David Addoteye

3

Como não parece possível evitar esse comportamento, implementei a seguinte solução. Adicione uma verificação duplicada a uma JTable checksubstituição de método:

// Check for duplicate entry
$db = JFactory::getDbo();
$query = $db->getQuery(true);

$query->select('COUNT(*)');
$query->from($this->get('_tbl'));
$query->where($db->quoteName('col1') . ' = ' . $db->quote($this->col1));

$db->setQuery($query);
$result = $db->loadResult();

if ($result) 
{
    $this->setError(" Duplicate entry for col1 = '" . $this->col1 . "'");
    return false;            
}

1

Você deve alterar seu código que faz com que a inserção verifique primeiro a duplicação e retorne um erro adequado (que você escreve) ao usuário e não confie em mostrar o erro real retornado pelo MySQL.


Sim, eu pensei que poderia ter que fazer isso, mas ainda estou preocupado que o Joomla esteja feliz em mostrar o SQL em uma mensagem de erro exibida ao usuário. Certamente isso é uma preocupação de segurança? Eu pensei que todo o ponto do prefixo da tabela aleatória é uma medida de segurança, não? Talvez a melhor prática seja fazer seu próprio tratamento de erros, mas pode haver uma situação que você não pode prever ... Apenas me parece um pouco estranho!
doovers

Bem, Joomla! não mostra a mensagem de erro SQL ao usuário, seu código mostra.
Ivo

Eu discordo, meu código não mostra a mensagem de erro, mas permite que o código principal do Joomla o mostre. Na minha opinião, o código principal não deve exibir o prefixo da tabela em nenhuma circunstância, pois é uma preocupação de segurança ...
doovers

Por que você não usa INSERT IGNORE em vez de INSERT?
Ivo

Boa sugestão e eu poderia fazer isso, mas como estou usando JTable, estaria mais inclinado a substituir o checkmétodo e testar uma duplicata lá. Eu quero exibir uma mensagem de erro para o usuário, mas não com o SQL nele!
doovers 14/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.