2012-04-11 27 views
6

Usando PHP, ¿cuál es la mejor manera de almacenar caracteres especiales (como el siguiente) en una base de datos MSQUL, para evitar inyecciones?Método correcto de PHP para almacenar caracteres especiales en MySQL DB

« " ' é à ù 

Así es como lo hago ahora:

$book_text=$_POST['book_text']; 
$book_text=htmlentities($book_text, "ENT_QUOTES"); 
$query=//DB query to insert the text 

continuación:

$query=//DB query to select the text 
$fetch=//The fetch of $book_text 
$book_text=html_entity_decode($book_text); 

De esta manera, toda mi texto tiene el formato de las entidades HTML. Pero creo que esto ocupa mucho espacio en la base de datos. Entonces, ¿hay una mejor manera?

+2

UTF-8 es su amigo –

+0

Los ' "ENT_QUOTES"' 'tiene que ser ENT_QUOTES' (sin comillas) porque es una constante predefinida PHP. ¿Y pensé que puedes colocarlo en bruto en el DB y cuando quieres repetirlo usas 'htmlentities' –

Respuesta

6

Use utf8 para almacenar estos valores.

Para evitar inyecciones use mysql_real_escape_string() (o declaraciones preparadas).

Para proteger de XSS use htmlspecialchars.

+0

utf8 en la compilación de la base de datos? –

+0

utf8 como codificación de columnas de tabla – Botanick

+1

no se puede mysql_real_escape_string() no es comparable con declaraciones preparadas. Esta función no es para evitar las inyecciones, y no puede evitarlas solo. –

1

Parece que su pregunta se puede generalizar para manejar y almacenar UTF8 con PHP y MySQL.

Para estar seguro de las inyecciones de SQL, debe usar declaraciones preparadas. Los controladores mysqli y PDO los admiten.

Las declaraciones preparadas son citadas automáticamente por el controlador, por lo que no tiene que preocuparse por esto.

Las tablas de la base de datos se deben crear con el conjunto de caracteres utf8 y la intercalación utf8_general_ci. Esta configuración my.cnf para hacer de su servidor MySQL se ejecuta a lo largo de UTF8:

[mysqld] 
default-character-set=utf8 
default-collation=utf8_general_ci 
character-set-server=utf8 
collation-server=utf8_general_ci 
init-connect='SET NAMES utf8' 

[client] 
default-character-set=utf8 

Tenga en cuenta que PHP es generalmente inconsciente de UTF-8, por lo que debe tener cuidado de usar cualquiera de iconv o mbstring bibliotecas para manejo de cadenas. Vea PHPWACT para una buena descripción.

de Activar carácter interno seguro de PHP es a Unicode

iconv_set_encoding('internal_encoding', 'UTF-8'); 
mb_internal_encoding('UTF-8'); 

También debe asegurarse de que el navegador conoce la codificación enviando el encabezado correcta o la adición de una etiqueta <meta> de juego de caracteres.

Eso debería hacerlo.

0

Su pregunta es una buena colección de confusiones. Usted logró confundir todo.
Tratemos de solucionarlo.

Usando PHP, ¿cuál es la mejor manera de almacenar caracteres especiales (como el siguiente) en una base de datos MSQUL, para evitar inyecciones?

Estas son cuestiones incomparables. El almacenamiento de caracteres especiales es una cuestión y evitar las inyecciones es otro. completamente diferente.

$book_text=htmlentities($book_text, "ENT_QUOTES"); 

esto es lo más divertido. aunque está destinado a proteger sus consultas, en realidad no hace nada. Porque en lugar de constantes ENT_QUOTES cuyo valor es 3, está utilizando la cadena ENT_QUOTES cuyo valor numérico es 0, por lo tanto, no está configurando ningún indicador.

Pero incluso si configura este indicador correctamente, no lo protegerá automáticamente. Porque un código de inyección puede no contener caracteres especiales.

Para evitar las inyecciones, debe seguir todo el conjunto de reglas , no una función simple "make_my_data_safe()". No hay varita mágica
Ver this my answer para los detalles.

En cuanto a los specialchars, es simple. El único problema es que NO hay conjuntos de caracteres especiales sólidos. Hay diferentes caracteres especiales para los diferentes entornos.

  • 'tienen significado para la base de datos y HTML
  • <> han significado para el HTML solamente
  • e A u tiene un significado para sólo el HTML, depende de la codificación.

tiene que utilizar diferentes reglas de formato para cada caso. Diferente, ni uno solo para todos.

para usar caracteres à HTML con HTML, debe establecer el encabezado HTTP adecuado. para utilizar el correo de U con la base de datos que tiene que fijar su tabla de codificación UTF-8 a la codificación y la conexión a UTF 8.

+0

$ book_text = htmlentities ($ book_text, "ENT_QUOTES"); fue un error al publicarlo aquí. En mi archivo php era $ book_text = htmlentities ($ book_text, ENT_QUOTES); –

Cuestiones relacionadas