Empêcher le message d'erreur d'afficher SQL


10

Dans mon tableau, j'ai créé un index sur 'col1' pour éviter les entrées en double qui fonctionne bien, mais le message d'erreur qui en résulte affiché à un utilisateur lorsqu'il tente d'ajouter une entrée en double me semble être un problème de sécurité car il affiche le SQL, y compris le préfixe de la table.

Existe-t-il un moyen d'empêcher Joomla d'afficher le SQL dans le message d'erreur?

J'ai essayé de changer les paramètres de rapport d'erreurs dans la configuration globale mais cela n'a aucun effet pour autant que je sache ...

Exemple de message:

Erreur

L'enregistrement a échoué avec l'erreur suivante: Entrée en double 'Test' pour la clé 'TestKey' SQL = INSERT INTO `jml_mycomp_tbl1` (` id`, `col1`,` ordering`, `state`,` created_by`) VALUES ('0' , 'Test', '2', '1', '730')


1
Je suis nouveau sur Joomla, mais vous avez tout à fait raison, toute erreur de zone utilisateur dans un environnement de production ne doit contenir aucun SQL. Pas seulement pour la sécurité, mais parce que cela n'a pas de sens pour les utilisateurs et donne une mauvaise expérience utilisateur. Dans un environnement de production, display_errors(paramètre PHP) doit être désactivé et ces erreurs ne doivent être enregistrées que dans votre journal des erreurs côté serveur.
MrWhite

Juste curieux, vous avez probablement déjà vérifié cela, mais vous n'avez aucun paramètre de débogage activé, n'est-ce pas? Vérifiez: Global Config> debug system setting. Vérifiez: Global Config> Niveau de rapport d'erreur. Vérifier: Plugins> Plugin de débogage Juste curieux de savoir si quelque chose d'étrange se passe. Je demande parce que je lisais ce learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle

@ChadWindnagle Salut Chad, oui j'ai essayé de l'éteindre mais pas d'effet ...
relookings

désolé vient d'être modifié, pouvez-vous simplement me faire savoir que vous avez vu le contenu mis à jour? thnx!
Chad Windnagle

@ChadWindnagle Non, je n'avais pas vu votre montage! J'ai essayé de signaler les erreurs mais j'ai oublié de désactiver le plugin (merci pour l'astuce) que je viens d'essayer maintenant mais toujours sans effet!
pauses

Réponses:


6

Vous pouvez peut-être utiliser une commande try catch:

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

Merci pour la suggestion, mais comme j'utilisais JTablela meilleure solution, c'était de remplacer la checkméthode comme dans ma réponse.
portes ouvertes

C'est une bonne réponse
David Addoteye

3

Puisqu'il ne semble pas possible d'empêcher ce comportement, j'ai implémenté la solution suivante. Ajoutez une vérification en double à un JTable checkremplacement de méthode:

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

Vous devez modifier votre code qui fait l'insertion pour vérifier d'abord la duplication et renvoyer une erreur appropriée (que vous écrivez) à l'utilisateur et ne pas compter sur l'affichage de l'erreur réelle retournée par MySQL.


Oui, je pensais que je devrais faire cela, mais je suis toujours inquiet que Joomla soit heureux d'afficher le SQL dans un message d'erreur affiché à l'utilisateur. C'est sûrement un problème de sécurité ?? Je pensais que le point entier du préfixe de table aléatoire est une mesure de sécurité non? Peut-être que la meilleure pratique consiste à faire votre propre gestion des erreurs, mais il peut y avoir une situation que vous ne pouvez pas prévoir ... Cela me semble un peu étrange!
pauses

Eh bien, Joomla! n'affiche pas le message d'erreur SQL à l'utilisateur, votre code le fait.
Ivo

Je ne suis pas d'accord, mon code n'affiche pas le message d'erreur mais permet au code principal de Joomla de l'afficher. À mon avis, le code de base ne devrait en aucun cas afficher le préfixe de la table car il s'agit d'un problème de sécurité ...
Découvertes

Pourquoi n'utilisez-vous pas INSERT IGNORE au lieu de INSERT?
Ivo

Bonne suggestion et je pourrais le faire, mais puisque j'utilise, JTableje serais plus enclin à remplacer la checkméthode et à y rechercher un doublon. Je veux afficher un message d'erreur à l'utilisateur, mais pas avec le SQL!
Portraits
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.