Evitar que el mensaje de error muestre SQL


10

En mi tabla, he creado un índice en 'col1' para evitar entradas duplicadas que funciona bien, pero el mensaje de error resultante que se muestra a un usuario cuando intenta agregar una entrada duplicada me parece un problema de seguridad, ya que muestra el SQL incluyendo El prefijo de la tabla.

¿Hay alguna forma de evitar que Joomla muestre el SQL en el mensaje de error?

Intenté cambiar la configuración de informes de errores en la configuración global, pero no tiene ningún efecto por lo que puedo decir ...

Mensaje de ejemplo:

Error

Save falló con el siguiente error: Duplicar la entrada 'Test' para la clave 'TestKey' SQL = INSERTAR EN `jml_mycomp_tbl1` (` id`, `col1`,` ordering`, `state`, 'created_by`) VALUES (' 0 ' , 'Prueba', '2', '1', '730')


1
Soy nuevo en Joomla, pero tienes toda la razón, cualquier error de usuario en un entorno de producción no debe contener ningún SQL. No solo por seguridad, sino porque no tiene sentido para los usuarios y ofrece una mala experiencia de usuario. En un entorno de producción, display_errors(configuración de PHP) debe estar desactivado y dichos errores solo deben registrarse en su registro de errores del lado del servidor.
MrWhite

Solo por curiosidad, probablemente ya haya verificado esto, pero no tiene ninguna configuración de depuración habilitada, ¿verdad? Verifique: Configuración global> configuración del sistema de depuración. Compruebe: Configuración global> Nivel de informe de errores. Verifique: Complementos> Complemento de depuración Solo tengo curiosidad por saber si hay algo extraño. Pregunto porque estaba leyendo este learn.theartofjoomla.com/developing-extensions/…
Chad Windnagle

@ChadWindnagle Hola Chad, sí, traté de desactivarlo, pero sin efecto ...
Doovers

lo siento solo editado, ¿puedes decirme que viste el contenido actualizado? gracias!
Chad Windnagle

@ChadWindnagle ¡No, no había visto tu edición! Intenté informar de errores, pero olvidé deshabilitar el complemento (gracias por la sugerencia) que acabo de probar ahora, ¡pero todavía no tiene ningún efecto!
Doovers

Respuestas:


6

Tal vez pueda usar un comando try catch:

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

Gracias por la sugerencia, pero dado que estaba usando JTablela mejor solución fue anular el checkmétodo como en mi respuesta.
Doovers

Esta es una buena respuesta
David Addoteye

3

Como no parece posible evitar este comportamiento, implementé la siguiente solución. Agregue una verificación duplicada a una JTable checkanulación de método:

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

Debe cambiar su código que hace que la inserción primero verifique si hay duplicados y devuelva un error apropiado (uno que usted escribe) al usuario y no confiar en mostrar el error real devuelto por MySQL.


Sí, pensé que podría tener que hacer eso, pero todavía me preocupa que Joomla esté feliz de mostrar el SQL en un mensaje de error que se muestra al usuario. ¿Seguramente esto es un problema de seguridad? Pensé que todo el punto del prefijo de la tabla aleatoria es como una medida de seguridad, ¿no? Tal vez la mejor práctica es hacer su propio manejo de errores, pero puede haber una situación que no puede prever ... ¡Simplemente me parece un poco extraño!
Doovers

Bueno, Joomla! no muestra el mensaje de error SQL al usuario, su código sí.
Ivo

No estoy de acuerdo, mi código no muestra el mensaje de error pero permite que el código central de Joomla lo muestre. En mi opinión, el código principal no debe mostrar el prefijo de la tabla en ninguna circunstancia, ya que es un problema de seguridad ...
Doovers

¿Por qué no usas INSERT IGNORE en lugar de INSERT?
Ivo

Buena sugerencia y podría hacerlo, pero como estoy usando JTable, estaría más inclinado a anular el checkmétodo y probar un duplicado allí. Quiero mostrar un mensaje de error al usuario, ¡pero no con el SQL!
Doovers
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.