[Resuelto] [Pregunta]: ¿Como pasar UTF-8 datos PHP?

Iniciado por Leguim, 7 Julio 2019, 21:29 PM

0 Miembros y 1 Visitante están viendo este tema.

Leguim

Buenos días.

Mi problema es que al obtener datos que sean cadenas de una base de datos y estas lleven un acento por ejemplo.. "información" me va a salir cualquier cosa cuando lo quiera imprimir con php sería algo como.. "informaci?on".
Ya busque en una pagina web donde pareciera que el problema radica en la función que uso para limpiar los datos y luego guardarlos en la base de datos.

Por ejemplo:


Código (php) [Seleccionar]

$dato = 'información':
$dato = limpiar_dato($dato);

Guardar_Registro($dato); // La función creara un nuevo registro en la base de datos con esta cadena como dato.


Esta es mi función:

Código (php) [Seleccionar]
function Limpiar_Dato($dato)
{
$dato = htmlspecialchars($dato);
$dato = trim($dato);
$dato = stripslashes($dato);

return $dato;
}


Debería convertir el dato en UTF-8 antes de guardarlo en la base de datos según lo que pude entender. Decian que debía buscar una linea "htmlentities" pero mi función siempre fue así ya que aprendí a programar php de un curso y usaba esta función el instructor.

Código (php) [Seleccionar]
$string = htmlentities($string); // Esto la linea se esparaba que tuviera la función

// para poder convertir así...
$dato = htmlentities($dato, ENT_QUOTES,'UTF-8');


La función del post que vi sería así de completa

Código (php) [Seleccionar]
function limpiarString($string) //función para limpiar strings
{
  $string = strip_tags($string);
  $string = htmlentities($string);
 
  return stripslashes($string);  
}


Esperaba que me digan principalmente si sólo debería agregar la linea htmlentities a mi función o cual es la mas segura de las dos. Gracias!

#!drvy

Lo ideal es resolver eso en la raíz: usar encoding UTF-8 en todos lados.

Dicho esto, mirate utf8_encode y utf8_decode.

Saludos

WHK

Mucho ojo, en la base de datos jamás se deben guardar los textos escapados en htmlentities, no solo tendrás problemas de inyección sql sino también de usabilidad, especialmente cuando quieras sacar valores hacia datos de tipo json, renderizar en mobile, etc.

htmlspecialchars se debe utilizar unicamente cuando vas a expulsar contenido html en la pagina web, no para guardar. También te recomiendo eliminar la eliminación de backslashes porque eso también provoca vulnerabilidades, si tu servidor añade slashes a tus peticiones es porque estás usando una versión muy antigua de php (que ya no está soportada).

No has probado utilizar codeigniter para evitar este tipo de problemas?

Saludos.

Leguim

#3
Uh! :O la función de Limpiar_Dato la saque de un curso donde aprendí sobre PHP me podrías decir cual podría ser una buena función para limpiar datos o la que usas vos para tus proyectos porque la verdad mucho no entiendo...

Te agradezco desde ya!
ahora reviso que es codeigniter

WHK

Depende a que te refieras con "limpiar", debes ser mas especifico, cada función de php se utiliza en casos muy particulares, por ejemplo, cada ves que necesites hacer una consulta a la base de datos debes utilizar mysql_real_escape_string() , cuando vas a expulsar contenido html en el sitio web debes utilizar htmlspecialchars(), cuando uses contenido de tipo json o javascript a traves de las cabeceras http no debes utilizar escapes, debes utilizar arrays multidimensionales y transformarlos a objetos json o javascript, para eso existe la función json_encode().

Saludos.

Leguim

Digamos siempre lo que hago es, tengo un formulario con un input de tipo texto donde el usuario podría enviar un texto cualquiera, correcto... Lo que yo hago con "Limpiar_Dato" es para evitar inyecciones SQL al mover la cadena o dato enviado por el usuario a la base de datos...

Pero parece todo más complicado que eso por lo que veo...  :(

WHK

Pues, cada función te protege de cada vulnerabilidad por separado, si juntas filtros en lugares donde no deben ir podrías causar vulnerabilidades.

Para evitar la inyección sql debes utilizar mysql_real_escape_string() en cada parametro que vayas a escribir en tu consulta sql, estos valores siempre deben ir encerrados en comillas dobles.

Saludos.

Leguim

La verdad se me hizo un choclo todo esto ahora jeje... Es decir las vulnerabilidades que existen de injecciones SQL serían 3? ¿Las que mencionaste anteriormente?
consulta base de datos, expulsar contenido html y a través de las cabeceras http?

La primera la entendí..
La segunda de expulsar contenido html sería algo con ajax que al hacer una petición al servidor inserto contenido html... ¿Tendría algo que ver con eso?
Luego lo de las cabeceras no me queda muy en claro la verdad..

Te doy las gracias por la paciencia que me estas teniendo, soy un poco duro para entender  ;D

WHK

Pues no hay uno ni tres, hay muchos: https://nvd.nist.gov/vuln/categories/cwe-layout , comienza con el cwe-19, pero de todas maneras, para no hacer esto tan extenso, solo limita a utilizar las funciones de php como corresponden y ya. PHP fue construido con todas sus funciones preparadas para evitar ciertos tipos de vulnerabilidades al desarrollar, puedes darle un vistazo a esto:

https://php.net/manual/es/security.php

Saludos.