Impedisci al messaggio di errore di mostrare SQL


10

Nella mia tabella ho creato un indice su "col1" per impedire voci duplicate che funzionano bene ma il messaggio di errore risultante visualizzato a un utente quando tentano di aggiungere una voce duplicata mi sembra essere un problema di sicurezza in quanto visualizza l'SQL incluso il prefisso della tabella.

C'è un modo per impedire a Joomla di visualizzare l'SQL nel messaggio di errore?

Ho provato a modificare le impostazioni di segnalazione errori nella configurazione globale ma non ha alcun effetto per quanto ne so ...

Messaggio di esempio:

Errore

Salvataggio fallito con il seguente errore: Voce duplicata 'Test' per la chiave 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` ordering`, `state`,` Created_by`) VALUES ('0' , 'test', '2', '1', '730')


1
Sono nuovo di Joomla, ma hai perfettamente ragione, tutti gli errori dell'utente in un ambiente di produzione non dovrebbero contenere alcun SQL. Non solo per la sicurezza, ma perché non ha senso per gli utenti e offre un'esperienza utente negativa. In un ambiente di produzione, display_errors(impostazione PHP) dovrebbe essere disattivato e tali errori dovrebbero essere registrati solo nel registro degli errori sul lato server.
MrWhite,

Solo curioso, probabilmente lo hai già verificato ma non hai abilitato alcuna impostazione di debug, vero? Controllare: Global Config> impostazione del sistema di debug. Controllare: Global Config> Livello di segnalazione errori. Controlla: Plugin> Plugin di debug Solo curioso se hai qualcosa di strano. Chiedo perché stavo leggendo questo learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle

@ChadWindnagle Ciao Chad, sì, ho provato a disattivarlo ma nessun effetto ...
scopre

scusa ho appena modificato, puoi farmi sapere che hai visto i contenuti aggiornati? thnx!
Chad Windnagle,

@ChadWindnagle No, non avevo visto la tua modifica! Ho provato a segnalare errori ma ho dimenticato di disabilitare il plug-in (grazie per il suggerimento) che ho appena provato ora ma ancora senza effetto!
scopre

Risposte:


6

Forse puoi usare un comando try catch:

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

Grazie per il suggerimento, ma dato che stavo usando JTablela soluzione migliore era di ignorare il checkmetodo come nella mia risposta.
scopre

Questa è una buona risposta
David Addoteye il

3

Poiché non sembra possibile prevenire questo comportamento, ho implementato la seguente soluzione. Aggiungi un controllo duplicato a una JTable checksostituzione del metodo:

// 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

È necessario modificare il codice che rende l'inserto per verificare innanzitutto la presenza di duplicati e restituire all'utente un errore corretto (uno che si scrive) e non fare affidamento sulla visualizzazione dell'errore effettivo restituito da MySQL.


Sì, ho pensato che avrei dovuto farlo, ma sono ancora preoccupato che Joomla sia felice di mostrare l'SQL in un messaggio di errore visualizzato all'utente. Sicuramente questo è un problema di sicurezza ?? Ho pensato che l'intero punto del prefisso della tabella casuale fosse come una misura di sicurezza no? Forse la migliore pratica è fare la tua gestione degli errori, ma potrebbe esserci una situazione che non puoi prevedere ... Mi sembra un po 'strano!
scopre

Bene, Joomla! non mostra il messaggio di errore SQL all'utente, il codice lo fa.
Ivo,

Non sono d'accordo, il mio codice non mostra il messaggio di errore ma consente al codice principale di Joomla di mostrarlo. A mio avviso, il codice principale non dovrebbe visualizzare il prefisso della tabella in nessuna circostanza poiché è un problema di sicurezza ...
scopre

Perché non usi INSERT IGNORE invece di INSERT?
Ivo,

Un buon suggerimento e potrei farlo, ma dal momento che sto usando JTablesarei più propenso a scavalcare il checkmetodo e testare un duplicato lì. Voglio mostrare un messaggio di errore all'utente, ma non con l'SQL in esso!
scopre
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.