Запретить сообщение об ошибке от показа SQL


10

В моей таблице я создал индекс 'col1' для предотвращения дублирования записей, который работает хорошо, но получающееся в результате сообщение об ошибке, отображаемое пользователю, когда он пытается добавить дублирующую запись, мне кажется проблемой безопасности, поскольку он отображает SQL, включая префикс таблицы.

Есть ли способ, чтобы остановить Joomla от отображения SQL в сообщении об ошибке?

Я попытался изменить настройки отчетов об ошибках в глобальном конфиге, но, насколько я могу судить, это никак не влияет ...

Пример сообщения:

ошибка

Сохранить не удалось со следующей ошибкой: Дублирующая запись 'Test' для ключа 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` ordering`, `state`,` creation_by`) VALUES ('0' , 'Test', '2', '1', '730')


1
Я новичок в Joomla, но вы абсолютно правы: любые ошибки пользовательской среды в производственной среде не должны содержать SQL. Не только для безопасности, но и потому, что это бессмысленно для пользователей и дает плохой пользовательский опыт. В производственной среде display_errors(настройка PHP) должна быть отключена, и такие ошибки должны регистрироваться только в журнале ошибок на стороне сервера.
MrWhite

Просто любопытно, вы, наверное, уже проверили это, но у вас нет каких-либо настроек отладки, не так ли? Проверьте: Global Config> настройки системы отладки. Проверьте: Global Config> Уровень сообщения об ошибках. Проверьте: Плагины> Плагин отладки Просто любопытно, если у вас происходит что-то странное. Я спрашиваю, потому что я читал это learn.theartofjoomla.com/developing-extensions/…
Чед Уинднэгл

@ChadWindnagle Привет, Чад, да, я пытался выключить это, но
безрезультатно

извините только что отредактировал, вы можете просто дать мне знать, что вы видели обновленное содержимое? Thnx!
Чэд Виннэгл

@ChadWindnagle Нет, я не видел твоих правок! Я попытался сообщить об ошибках, но я забыл об отключении плагина (спасибо за подсказку), который я только что попробовал сейчас, но все равно безрезультатно!
Дуверс

Ответы:


6

Может быть, вы можете использовать команду try catch:

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 в нем!
Дуверс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.