sql >> Base de Datos >  >> RDS >> Mysql

¿Cuál es la forma más segura de agregar html/css/js a mysql?

Sí, MySQL puede almacenar cualquier tipo de texto de forma técnicamente segura. Lo que significa que MySQL guardará el texto tal como está y lo devolverá sin perder ningún dato.

Mysql no difiere entre el contenido del texto, por lo que no importa si es código HTML, CSS, JS o el último correo electrónico de tus amigos.

Sin embargo, si genera el texto más adelante, debe tener cuidado de que no haya una inyección de código no deseado después de haber extraído los datos de mysql. Pero eso no está relacionado con MySQL en realidad.

Para que sql sea más seguro, pase el identificador de la base de datos a mysql_real_escape_string o incluso mejor usa MySQLi y/o PDO y declaraciones preparadas.

Tu código

Parece que tu código está tratando de evitar algo, pero al final resulta bastante inútil:

function filter($data) {
$data = trim(htmlentities(strip_tags($data)));

if (get_magic_quotes_gpc())
    $data = stripslashes($data);
    $data= strip_tags($data);

$data = mysql_real_escape_string($data);

return $data;}

Normalice los datos antes de procesarlos

En primer lugar, debe cambiar la posición del cheque para get_magic_quotes_gpc para normalizar los datos en los que está trabajando la función. Sería aún mejor si su aplicación no se basara en él, sino que simplemente negara el funcionamiento si esa opción está habilitada - ver esta información importante aquí sobre eso si te preocupa la seguridad.

Pero para la seguridad de su código publicado, primero normalicemos el valor de entrada a la función antes de procesarlo más. Esto se hace moviendo la marca de verificación a la parte superior de la función.

function filter($data)
{
   // normalize $data because of get_magic_quotes_gpc
   $dataNeedsStripSlashes = get_magic_quotes_gpc();
   if ($dataNeedsStripSlashes)
   {
     $data = stripslashes($data);
   }

   // normalize $data because of whitespace on beginning and end
   $data = trim($data);

   // strip tags
   $data = strip_tags($data);

   // replace characters with their HTML entitites
   $data = htmlentities($data);

   // mysql escape string    
   $data = mysql_real_escape_string($data);

   return $data;
 }

En esta función modificada, las comillas mágicas (que no debe usar) se han movido a la parte superior. Esto asegura que, independientemente de que la opción esté activada o desactivada, los datos siempre se procesarán de la misma manera. Su función no lo hizo, habría creado diferentes resultados para los mismos datos pasados. Así que esto se ha solucionado.

Más problemas con su función

Incluso la función se ve mejor ahora, todavía tiene muchos problemas. Por ejemplo, no está claro qué hace realmente la función. Hace muchas cosas a la vez y algunas de ellas son contradictorias:

  • Elimina las etiquetas HTML, lo que es una señal de que $data no debe contener HTML
  • Pero luego conviertes el texto de $data tener realmente contener entidades HTML.

Entonces, ¿cuáles deberían ser los datos? HTML o no? No introduce más seguridad si las cosas se vuelven poco claras porque esto beneficiará que los errores entren en su programa y al final incluso superen sus precauciones de seguridad.

Así que deberías tirar el código y considerar lo siguiente:

  • Si la entrada a su aplicación no es válida, no la filtre. En su lugar, evite el uso posterior de entradas no válidas. Por lo tanto, necesita una función para validar la entrada antes de utilizarla.
  • No cambie los datos solo porque piensa esto podría hacer algo más seguro. En su lugar, cambie y codifique los datos donde sea necesario y apropiado.
    • Haga que su aplicación solo funcione con comillas mágicas desactivadas. Se desaconseja confiar en esta función. Y luego no hay necesidad de verificar eso en todo su código.
    • Para almacenar algo de forma segura dentro de la base de datos, escape los datos antes de usarlos solo en la consulta. No en algún otro lugar de su aplicación. Use declaraciones preparadas para eso.
    • No es necesario discutir los datos antes de colocarlos en la base de datos si son válidos. Pero debe codificarlo correctamente cuando lo envíe a la página web . Y solo allí una aplicación sabe en qué codificación debe estar. No lo sabe cuando ingresa los datos en la base de datos.

Entonces, si desea que su código sea más seguro, no se trata de agregar un montón de funciones a algunos datos porque cree que están relacionados con la seguridad. Al hacerlo, no hace que su software sea más seguro sino menos seguro.

  1. Nunca confíes en los datos de los usuarios.
  2. Asegúrese de que los datos estén en el formato que necesita procesamiento previo .
  3. Utilice la herramienta adecuada para el trabajo en el lugar correcto.
  4. Nunca utilice herramientas para adivinar. Obtenga conocimiento en su lugar, que paga no solo en términos de seguridad.