Verhindern Sie, dass eine Fehlermeldung SQL anzeigt

10

In meiner Tabelle habe ich einen Index für 'col1' erstellt, um doppelte Einträge zu verhindern, was gut funktioniert. Die resultierende Fehlermeldung, die einem Benutzer angezeigt wird, wenn er versucht, einen doppelten Eintrag hinzuzufügen, scheint mir jedoch ein Sicherheitsrisiko zu sein, da SQL einschließlich angezeigt wird das Tabellenpräfix.

Gibt es eine Möglichkeit, Joomla daran zu hindern, SQL in der Fehlermeldung anzuzeigen?

Ich habe versucht, die Einstellungen für die Fehlerberichterstattung in der globalen Konfiguration zu ändern, aber es hat keine Auswirkungen, soweit ich das beurteilen kann ...

Beispielnachricht:

Error

Das Speichern schlug mit folgendem Fehler fehl: Doppelter Eintrag 'Test' für Schlüssel 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` order`, `state`,` created_by`) VALUES ('0') , 'Test', '2', '1', '730')

doovers
quelle
1
Ich bin neu bei Joomla, aber Sie haben absolut Recht, alle Userland-Fehler in einer Produktionsumgebung sollten kein SQL enthalten. Nicht nur aus Sicherheitsgründen, sondern weil es für Benutzer bedeutungslos ist und eine schlechte Benutzererfahrung bietet. In einer Produktionsumgebung sollte display_errors(PHP-Einstellung) deaktiviert sein und solche Fehler sollten nur in Ihrem serverseitigen Fehlerprotokoll protokolliert werden.
MrWhite
Nur neugierig, Sie haben dies wahrscheinlich bereits überprüft, aber Sie haben zufällig keine Debug-Einstellungen aktiviert, oder? Überprüfen Sie: Global Config> Debug-Systemeinstellung. Überprüfen Sie: Globale Konfiguration> Fehlerberichtsebene. Check: Plugins> Debug Plugin Nur neugierig, ob etwas Seltsames los ist. Ich frage, weil ich dieses learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle
@ChadWindnagle Hallo Chad, ja, ich habe versucht, das auszuschalten, aber keine Wirkung ...
Doovers
Entschuldigung, gerade bearbeitet. Können Sie mich wissen lassen, dass Sie den aktualisierten Inhalt gesehen haben? Danke!
Chad Windnagle
@ChadWindnagle Nein, ich habe deine Bearbeitung nicht gesehen! Ich habe versucht, Fehler zu melden, aber ich habe vergessen, das Plugin zu deaktivieren (danke für den Tipp), was ich gerade versucht habe, aber immer noch keine Wirkung!
Doovers

Antworten:

6

Vielleicht können Sie einen try catch-Befehl verwenden:

try
{
//Your code to run the SQL here 
}
catch (Exception $e)
{
$this->setError('The error message you want');
return false;
}
Tuan Pham Ngoc
quelle
Vielen Dank für den Vorschlag, aber da ich JTabledie beste Lösung verwendet habe, war es, die checkMethode wie in meiner Antwort zu überschreiben .
Doovers
Dies ist eine gute Antwort
David Addoteye
3

Da es anscheinend nicht möglich ist, dieses Verhalten zu verhindern, habe ich die folgende Lösung implementiert. Fügen Sie einer JTable checkMethodenüberschreibung eine doppelte Prüfung hinzu :

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

Sie sollten Ihren Code so ändern, dass die Einfügung zuerst nach Duplikaten sucht und dem Benutzer einen ordnungsgemäßen Fehler (einen, den Sie schreiben) zurückgibt, und sich nicht darauf verlassen, dass der von MySQL zurückgegebene tatsächliche Fehler angezeigt wird.

Ivo
quelle
Ja, ich dachte, ich müsste das vielleicht tun, aber ich bin immer noch besorgt, dass Joomla die SQL gerne in einer Fehlermeldung anzeigt, die dem Benutzer angezeigt wird. Sicher ist dies ein Sicherheitsbedenken? Ich dachte, der springende Punkt des zufälligen Tabellenpräfix ist als Sicherheitsmaßnahme nein? Vielleicht ist es die beste Vorgehensweise, Ihre eigene Fehlerbehandlung durchzuführen, aber es kann Situationen geben, die Sie nicht vorhersehen können ... Kommt mir nur ein bisschen seltsam vor!
Doovers
Nun, Joomla! zeigt dem Benutzer die SQL-Fehlermeldung nicht an, Ihr Code jedoch.
Ivo
Ich bin nicht einverstanden, mein Code zeigt die Fehlermeldung nicht an, aber der Joomla-Kerncode kann sie anzeigen. Meiner Meinung nach sollte der
Kerncode unter
Warum verwenden Sie nicht INSERT IGNORE anstelle von INSERT?
Ivo
Guter Vorschlag und ich könnte das tun, aber da ich benutze, JTablewäre ich eher geneigt, die checkMethode zu überschreiben und dort auf ein Duplikat zu testen. Ich möchte dem Benutzer eine Fehlermeldung anzeigen, nur nicht mit dem SQL darin!
Doovers