que - PHP mysql_real_escape_string()-> stripslashes() dejando mĂșltiples barras
mysqli_escape_string (3)
Tengo problemas para escapar / eliminar cadenas con PHP / MySQL: siempre parece haber barras redundantes.
Tomemos como ejemplo la siguiente cadena:
<span style="text-decoration:underline;">underline</span>
Cuando agrego una cadena a la base de datos, la estoy escapando con mysql_real_escape_string()
y lo siguiente se almacena en la base de datos ( EDIT : lo verifiqué consultando la base de datos directamente con la aplicación mysql):
<span style=///"text-decoration:underline;///">underline</span>
Al volver a leer la base de datos, paso la cadena a través de stripslashes()
y se devuelve lo siguiente:
<span style=/"text-decoration:underline;/">underline</span>
Dado que las citas aún se escapan, rompe el html y el texto no está subrayado.
- ¿Por qué
mysql_real_escape_string()
agregando tres barras diagonales, y las barras destripslashes()
eliminando dos barras diagonales? Espero que ambos agreguen / eliminen una barra. - ¿Cómo puedo evitar que esto suceda?
- ¿Me estoy acercando a esto de la manera correcta?
Al agregar una cadena a la base de datos, la estoy escapando con
mysql_real_escape_string()
y lo siguiente se almacena en la base de datos:
<span style=///"text-decoration:underline;///">underline</span>
No, no es. Cuando escapa cadenas en una consulta de SQL, solo es para transportar los datos en la consulta. La base de datos analiza la consulta y almacena los datos en la base de datos, sin barras diagonales adicionales. Por lo tanto, cuando recupera datos de la base de datos, no debe destapar nada. Es un error común.
Si encuentra que hay barras en exceso en la salida, probablemente tenga activadas las comillas mágicas. Apágalos
Editar:
mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT INTO foo (bar) VALUES ("<span style=///"text-decoration:underline;///">underline</span>");
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar |
+-------------------------------------------------------------+
| <span style=/"text-decoration:underline;/">underline</span> |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
Como puede ver, la consulta tiene un nivel más de escape de lo que los datos aparecen dentro de la base de datos y, en consecuencia, cómo sale al consultarla. En su caso, lo que probablemente está sucediendo es que tiene activadas las citas mágicas y luego escapa de las cadenas antes de incrustarlas en una consulta. Esto conduce a un doble escape, manipulando sus datos. La solución adecuada es seguir escapando de las cadenas a medida que lo hace, pero desactive las citas mágicas. Y no haga nada sobre los datos, ya que sale de la base de datos. Tenga en cuenta que los datos que ya están en el sistema deben limpiarse primero.
Mejor solución
En su archivo php.ini, es probable que la directiva magic_quotes_gpc
esté magic_quotes_gpc
. Esto debe ser desactivado por razones de seguridad. Si no tiene acceso al archivo php.ini (por ejemplo, en un host compartido), siempre puede lograr lo mismo usando una directiva .htaccess (suponiendo que se trata de un servidor apache).
En tu php.ini
magic_quotes_gpc Off
En un archivo .htaccess:
php_flag magic_quotes_gpc Off
¿Por qué está pasando esto?
La razón por la que esto está sucediendo se debe al siguiente curso de lógica.
- Una cadena que necesita escapar se envía al servidor.
-
This is my string. It''s awesome.
-
- Magic Quotes se escapa del apóstrofe antes de que llegue a su código.
-
This is my string. It/'s awesome
-
-
mysql_real_escape_string
ahora tiene dos caracteres para escapar, la barra invertida//
y el apóstrofe/'
.-
This is my string. It///'s awesome
-
- Esta nueva cadena super-escapada se almacena en la base de datos.
- Cuando la cadena se recupera de la base de datos, se pasa a
stripslashes
. Esto elimina los dos escapes que se agregaron en el paso 3, pero dado que una de las barras invertidas se ha escapado,stripslashes
cree que pertenece.-
This is my string. It/'s awesome
-
Este problema realmente puede salirse de control cuando vuelve a enviar estas cadenas a la base de datos, ya que cada vez el número de barras invertidas se multiplica.
Solución alternativa
Una alternativa rápida y fácil sería simplemente eliminar las barras agregadas por magic_quotes
antes de pasar la cadena a mysql_real_escape_string
.
$str = stripslashes($_POST[''str'']);
$str = mysql_real_escape_string($str);
Si get_magic_quotes_gpc()
está desactivado en SERVER, solo podemos usar
$data= mysql_real_escape_string($_POST[''data'']);
Si get_magic_quotes_gpc()
está get_magic_quotes_gpc()
en SERVER, tenemos que usar
$data= mysql_real_escape_string(stripslashes($_POST[''data'']));
De lo contrario agregue dos barras invertidas con sus datos.
También otra solución es que podemos usar stripslashes($data)
mientras que stripslashes($data)
de datos si usamos solo mysql_real_escape_string($_POST[''data'']);