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')

doovers
fonte
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;
}
Tuan Pham Ngoc
fonte
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;            
}
doovers
fonte
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.

Ivo
fonte
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