Zapobiegaj wyświetlaniu komunikatu o błędzie

10

W mojej tabeli utworzyłem indeks „col1”, aby zapobiec powielaniu wpisów, co działa dobrze, ale wynikowy komunikat o błędzie wyświetlany użytkownikowi podczas próby dodania zduplikowanego wpisu wydaje mi się problemem z punktu widzenia bezpieczeństwa, ponieważ wyświetla SQL, w tym prefiks tabeli.

Czy jest jakiś sposób, aby powstrzymać Joomla przed wyświetlaniem kodu SQL w komunikacie o błędzie?

Próbowałem zmienić ustawienia raportowania błędów w konfiguracji globalnej, ale nie ma to żadnego wpływu, o ile mogę stwierdzić ...

Przykładowa wiadomość:

Błąd

Zapis nie powiódł się z następującym błędem: Zduplikowany wpis „Test” dla klucza „TestKey” SQL = WSTAWIĆ DO „jml_mycomp_tbl1` („ id ”,„ col1 ”,„ zamawianie ”,„ stan ”,„ utworzono przez ”) WARTOŚCI („ 0 ” , „Test”, „2”, „1”, „730”)

doovers
źródło
1
Jestem nowy w Joomla, ale masz całkowitą rację, wszelkie błędy użytkownika w środowisku produkcyjnym nie powinny zawierać SQL. Nie tylko ze względu na bezpieczeństwo, ale dlatego, że nie ma on znaczenia dla użytkowników i zapewnia złe wrażenia. W środowisku produkcyjnym display_errors(ustawienie PHP) powinno być wyłączone, a takie błędy powinny być rejestrowane tylko w dzienniku błędów po stronie serwera.
MrWhite
Ciekawe, prawdopodobnie już to sprawdziłeś, ale nie masz włączonych żadnych ustawień debugowania, prawda? Sprawdź: Konfiguracja globalna> ustawienie systemu debugowania. Sprawdź: Konfiguracja globalna> Poziom zgłaszania błędów. Sprawdź: Wtyczki> Wtyczka debugowania Ciekawe, czy dzieje się coś dziwnego. Pytam, ponieważ czytałem ten learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle
@ChadWindnagle Cześć Czad, tak, próbowałem to wyłączyć, ale bez efektu ...
doovers
przepraszam, właśnie edytowałem, czy możesz mi powiedzieć, że widziałeś zaktualizowaną zawartość? dzięki!
Chad Windnagle
@ChadWindnagle Nie Nie widziałem twojej edycji! Próbowałem zgłaszać błędy, ale zapomniałem o wyłączeniu wtyczki (dziękuję za podpowiedź), której właśnie spróbowałem, ale nadal nie ma efektu!
doovers

Odpowiedzi:

6

Może możesz użyć polecenia 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
źródło
Dzięki za sugestię, ale ponieważ korzystałem JTablez najlepszego rozwiązania, zastąpiłem checkmetodę jak w mojej odpowiedzi.
doovers
To dobra odpowiedź
David Addoteye
3

Ponieważ nie można zapobiec temu zachowaniu, zaimplementowałem następujące rozwiązanie. Dodaj zduplikowane sprawdzenie do JTable checkzastąpienia metody:

// 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
źródło
1

Powinieneś zmienić kod, który powoduje, że wstawka najpierw sprawdza duplikat i zwraca użytkownikowi poprawny błąd (taki, który piszesz), a nie polegać na pokazywaniu rzeczywistego błędu zwróconego przez MySQL.

Ivo
źródło
Tak, myślałem, że może będę musiał to zrobić, ale nadal martwię się, że Joomla z przyjemnością pokazuje SQL w komunikacie o błędzie wyświetlanym użytkownikowi. Z pewnością jest to problem bezpieczeństwa? Myślałem, że cały sens losowego przedrostka tabeli jest ze względów bezpieczeństwa nie? Być może najlepszą praktyką jest samodzielna obsługa błędów, ale może wystąpić sytuacja, której nie można przewidzieć ... Wydaje mi się to trochę dziwne!
doovers
Cóż, Joomla! Twój kod nie wyświetla komunikatu o błędzie SQL.
Ivo
Nie zgadzam się, mój kod nie wyświetla komunikatu o błędzie, ale pozwala na wyświetlenie go w kodzie podstawowym Joomla. Moim zdaniem kod podstawowy nie powinien w żadnym wypadku wyświetlać prefiksu tabeli, ponieważ stanowi to zagrożenie bezpieczeństwa ...
doovers
Dlaczego nie używasz INSERT IGNORE zamiast INSERT?
Ivo
Dobra sugestia i mógłbym to zrobić, ale ponieważ używam JTable, byłbym bardziej skłonny do zastąpienia checkmetody i przetestowania tam duplikatu. Chcę wyświetlić komunikat o błędzie dla użytkownika, ale nie z SQL!
doovers