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


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;
}

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;            
}

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.