special - php pdo quote
mysql_real_escape_string() dejando barras en MySQL (9)
Probablemente debes tener las citas mágicas activadas. Averiguar exactamente cómo apagarlo puede ser un gran dolor de cabeza en PHP. Si bien puede desactivar las comillas mágicas con set_magic_quotes_runtime(0)
, no es suficiente: las comillas mágicas ya han alterado los datos de entrada en este punto, por lo que debe deshacer el cambio. Pruebe con este fragmento: http://talks.php.net/show/php-best-practices/26
O mejor aún: deshabilite las comillas mágicas en php.ini
y cualquier archivo .htaccess en el que se pueda establecer.
Acabo de mudarme a una nueva empresa de hosting y ahora cada vez que se escapa una cadena con:
mysql_real_escape_string($str);
las barras permanecen en la base de datos. Esta es la primera vez que veo esto suceder, así que ninguno de mis scripts usa
stripslashes()
nunca más.
Esto es en un CentOS 4.5 de 64 bits ejecutando php 5.2.6 como fastcgi en un servidor lighttpd 1.4. Me he asegurado de que todas las opciones de magic_quotes estén desactivadas y la API del cliente mysql sea 5.0.51a.
Tengo el mismo problema en todos mis 6 servidores web.
Cualquier ayuda sería apreciada.
Gracias.
Editar:
Magic Quotes no está activado. Por favor, no recomendamos apagarlo. ESTE NO ES EL PROBLEMA.
suena como si tuviera citas mágicas activadas. Apagarlo no es muy difícil: simplemente crea un archivo en tu directorio raíz llamado .htaccess
y pon esta línea en él:
php_flag magic_quotes off
Si eso no es posible por la razón que sea, o si desea cambiar su aplicación para poder manejar citas mágicas, use esta técnica:
En lugar de acceder directamente a las variables de solicitud, use una función. Esa función puede verificar si las comillas mágicas están activadas o desactivadas y quitar las barras en consecuencia. Simplemente ejecutar stripslashes () sobre todo no funcionará, porque se deshace de las barras que realmente desea.
function getVar($key) {
if (get_magic_quotes_gpc()) {
return stripslashes($_POST[$key]);
} else {
return $_POST[$key];
}
}
$x = getVar(''x'');
Ahora que ya lo tienes, todas tus variables entrantes están listas para ser escapadas de nuevo y mysql_real_escape_string()
no las rellenará.
mysql_real_escape_string($str);
se supone que haga exactamente eso. está destinado a agregar barras invertidas a caracteres especiales, especialmente cuando desea pasar la consulta a mysql. Tenga en cuenta que también tiene en cuenta el conjunto de caracteres de mysql.
Para prácticas de codificación más seguras, sería bueno editar el código y usar stripslashes()
para leer los datos y eliminar las barras.
La función a continuación eliminará correctamente las barras antes de insertarlas en la base de datos. Sé que dijiste que las comillas mágicas no están encendidas, pero algo está agregando barras, así que prueba la siguiente página y mira la salida. Te ayudará a descubrir dónde. Llamar con page.php? Var = algo-con''data_that; will`be | escaped
Lo más probable es que vea el número tres sacando más barras que las necesarias.
* Cambia los detalles de DB también.
<?php
$db = mysql_connect(''host'', ''user'', ''pass'');
$var = $_REQUEST[''var''];
echo "1: $var :1<br />";
echo "2: ".stripslashes($var)." :2<br />";
echo "3: ".mysql_real_escape_string($var)." :3<br />";
echo "4: ".quote_smart($var)." :4<br />";
function quote_smart($value)
{
// Stripslashes is gpc on
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if ( !is_numeric($value) )
{
$value = mysql_real_escape_string($value);
}
return $value;
}
?>
Puedo pensar en una serie de cosas que podrían causar esto. Pero depende de cómo invoque las consultas SQL. Si se movió para usar consultas parametrizadas como con PDO, entonces el escape no es necesario, lo que significa que la llamada a mysql_real_escape_string
agrega las barras adicionales.
Si está usando mysql_query
etc., entonces debe haber algún código en alguna parte como addslashes
que esté haciendo esto. Esto podría ser antes de que los datos entren en la base de datos o después.
También dices que has deshabilitado las comillas mágicas ... si aún no lo has hecho, simplemente haz una comprobación en el código con algo como esto:
echo htmlentities($_GET[''value'']); // or $_POST, whichever is appropriate
Asegúrese de que no haya barras en ese valor, luego también verifique esto:
echo "Magic quotes is " . (get_magic_quotes_gpc() ? "ON" : "OFF");
Sé que has dicho muchas veces que no se trata de citas mágicas, pero para nosotros, los chicos que intentamos ayudar, debemos asegurarnos de que hayas comprobado la salida real de PHP en lugar de simplemente cambiar la configuración (lo que podría no haber funcionado).
No estoy seguro si entiendo el problema correctamente pero tuve el mismo problema. No importaba lo que hiciera, las barras estaban allí cuando la cuerda se escapó. Como necesitaba que el valor insertado estuviera en el mismo formato exacto en que se ingresó, utilicé
htmlentities($inserted_value)
esto dejará todas las comillas insertadas sin marcar pero inofensivas.
las barras permanecen en la base de datos.
Significa que sus datos se escapan por partida doble.
Hay 2 posibles razones:
citas mágicas están encendidas, a pesar de tus sentimientos. Verifíquelo
Hay un código en su aplicación, que simplemente imita el comportamiento de las comillas mágicas, escapando de todas las entradas.
Esta es una idea errónea muy común de tener una función de escape general para "proteger" todos los datos entrantes. Si bien no sirve para nada, también es responsable de casos como este.
De eso, solo encuentra esa función y límpiala.
¿Cuál podría ser el problema (fue con nosotros) que utiliza mysql_real_escape_string()
varias veces en la misma var. Cuando lo usa varias veces, agregará las barras inclinadas.
Es probable que el host que has movido tenga magic_quotes_runtime
activado. Puedes desactivarlo con set_magic_quotes_runtime(0)
.
Desactive magic_quotes_runtime
, y luego cambie su código para usar variables de enlace, en lugar de usar la cadena de escape.