Запобігати показу повідомлення про помилку SQL


10

У своїй таблиці я створив індекс на "col1" для запобігання повторюваних записів, який працює добре, але отримане повідомлення про помилку, яке відображається користувачеві при спробі додати повторюваний запис, мені здається, є проблемою безпеки, оскільки він відображає SQL, включаючи префікс таблиці.

Чи є спосіб зупинити показ Joomla у відображенні SQL у повідомленні про помилку?

Я спробував змінити параметри звітування про помилки в глобальній конфігурації, але це не впливає, наскільки я можу сказати ...

Приклад повідомлення:

Помилка

Не вдалося зберегти з наступною помилкою: Дублікат запису "Тест" для ключа "TestKey" SQL = ВСТАВЛЯЄТЬСЯ в `jml_mycomp_tbl1` (` id`, `col1`,` замовлення`, `стан`,` створено_by`) VALUES ('0' , "Тест", "2", "1", "730")


1
Я новачок у Joomla, але ви абсолютно праві, будь-які помилки користувача у виробничому середовищі не повинні містити SQL. Не тільки для безпеки, а тому, що це безглуздо для користувачів і дає погану роботу користувача. У виробничому середовищі display_errors(налаштування PHP) слід вимкнутись, і такі помилки повинні входити в журнал помилок лише на вашому сервері.
Містер Білий

Цікаво, що ви, мабуть, уже перевірили це, але у вас не трапляються налаштування налагодження? Перевірте: Global Config> налаштування налагодження системи. Перевірте: Global Config> Level error error. Перевірте: Плагіни> Плагін налагодження Просто цікаво, якщо у вас є щось дивне. Я запитую, тому що я читав це Learn.theartofjoomla.com/developing-extensions/…
Чад Вітнегл

@ChadWindnagle Привіт Чаде, так, я спробував увімкнути це, але ніякого ефекту ...
doovers

Вибачте щойно відредагований, чи можете ви просто повідомити мені, що ви побачили оновлений вміст? thnx!
Вітер Чад

@ChadWindnagle Ні. Я не бачив вашої редакції! Я намагався повідомити про помилки, але забув про відключення плагіна (спасибі за підказку), який я просто спробував зараз, але досі ефекту немає!
Дуоверс

Відповіді:


6

Можливо, ви можете скористатися командою спробувати вловлювання:

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

Дякую за пропозицію, але, оскільки я використовував JTableнайкраще рішення, було перекрити checkметод, як у моїй відповіді.
Дуоверс

Це гарна відповідь
Девід Аддотеє

3

Оскільки, здається, неможливо запобігти такій поведінці, я реалізував таке рішення. Додайте дублікат чека до JTable checkметоду, який перекриває:

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

Ви повинні змінити свій код, який змушує вставку, щоб спочатку перевірити наявність дубліката та повернути користувачеві належну помилку (ту, яку ви пишете), а не покладатися на показ фактичної помилки, поверненої MySQL.


Так, я подумав, що можу це зробити, але я все ще стурбований тим, що Joomla із задоволенням показує SQL у повідомленні про помилку, показаному користувачеві. Звичайно, це питання безпеки ?? Я подумав, що вся суть префікса випадкової таблиці - як міра безпеки ні? Можливо, найкраща практика - робити власні помилки, але може виникнути ситуація, яку ви не можете передбачити ... Просто мені це здається дивним!
Доуверс

Ну, Джомла! не показує користувачеві повідомлення про помилку SQL, ваш код робить.
Іво

Я не згоден, мій код не відображає повідомлення про помилку, але дозволяє основний код Joomla показувати його. На мою думку, основний код не повинен відображати префікс таблиці за жодних обставин, оскільки це стосується безпеки ...
doovers

Чому б не використовувати INSERT IGNORE замість INSERT?
Іво

Гарна пропозиція, і я міг би це зробити, але оскільки я використовую, JTableя був би більш схильний перекрити checkметод і перевірити наявність дубліката там. Я хочу відобразити повідомлення про помилку користувачеві, тільки не зі SQL в ньому!
doovers
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.