Foros del Web » Programando para Internet » PHP »

Addslashes o Addcslashes o... alguna sugerencia?

Estas en el tema de Addslashes o Addcslashes o... alguna sugerencia? en el foro de PHP en Foros del Web. Con qué es mejor marcar las cadenas q vayamos a insertar en una base de datos? De qué manera podemos asegurarnos que inserte lo que ...
  #1 (permalink)  
Antiguo 09/08/2006, 04:05
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 11 años, 5 meses
Puntos: 0
Addslashes o Addcslashes o... alguna sugerencia?

Con qué es mejor marcar las cadenas q vayamos a insertar en una base de datos? De qué manera podemos asegurarnos que inserte lo que se inserte en un campo de texto (siempre y cuando corresponda con el tipo de campo de la tabla) será aceptado por la base de datos?

Me gustaría que pudieran opinar al respecto y saber qué suele utilizar la peña de x aquí ya que en la mayoría de los ejemplos nadie pone nada de esto.

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
  #2 (permalink)  
Antiguo 09/08/2006, 10:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Lo importante para evitar problemas de SQL sería "escapar" los caracteres tipo comillas dobles o simples .. etc.

Esto en PHP se hace con "addslashes()" siempre y cuando no vengan ya esos caracteres "escapados" (por uso por ejemplo de "magic_quote_gpc o runtime")

En los comentarios de la función addslashes() de PHP tienes ejempolos interesantes como:

Cita:
Luiz Miguel Axcar (lmaxcar at yahoo dot com dot br)
01-Sep-2005 09:16
Hello,

If you are getting trouble to SGDB write/read HTML data, try to use this:

Código PHP:
<?php

//from html_entity_decode() manual page
function unhtmlentities ($string) {
   
$trans_tbl =get_html_translation_table (HTML_ENTITIES );
   
$trans_tbl =array_flip ($trans_tbl );
   return 
strtr ($string ,$trans_tbl );
}

//read from db
$content stripslashes (htmlspecialchars ($field['content']));

//write to db
$content unhtmlentities (addslashes (trim ($_POST['content'])));

//make sure result of function get_magic_quotes_gpc () == 0, you can get strange slashes in your content adding slashes twice

//better to do this using addslashes
$content = (! get_magic_quotes_gpc ()) ? addslashes ($content) : $content;

?>
En general .. se trata de ver si el estado de "magic_quote_gpc" para ver si corresponde añadir más "escapes" o no (es la última línea de este código).

(De la referencia de php.net sobre get_magic_quote_gpc():)
Cita:
Ejemplo 1. Ejemplo de get_magic_quotes_gpc()

Código PHP:
<?php
echo get_magic_quotes_gpc();        // 1
echo $_POST['apellido'];            // O\'reilly
echo addslashes($_POST['apellido']); // O\\\'reilly

if (!get_magic_quotes_gpc()) {
   
$apellido addslashes($_POST['apellido']);
} else {
   
$apellido $_POST['apellido'];
}

echo 
$apellido// O\'reilly
$sql "INSERT INTO apellidos (apellido) VALUES ('$apellido')";
?>


Por otro lado .. Si usas Mysql por ejemplo tiene una función equivalente diseñada para Mysql denominada:

mysql_real_escpape_string()
www.php.net/mysql_real_escpape_string


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 09/08/2006, 11:03
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 11 años, 5 meses
Puntos: 0
Muchas gracias Cluster, siempre he usado el Addslashes pero no sabía nada del magic_quote_gpc. Supongo q x eso cuando recogía algo con caracteres especiales salían tantas "\" en lugar de una sola.

Pues nada, eso significa q tengo q renovar algunos scripts, jejeje.

Saludos.

AÑADO:

Con lo q acabas de enseñarme, verías correctas estas funciones?

Código PHP:
function marcar ($content) {
    
$content = (! get_magic_quotes_gpc ()) ? unhtmlentities (addslashes ($content)) : $content;
    return 
$content;
}
function 
desmarcar ($content) {
    
$content stripslashes (htmlspecialchars ($content);
    return 
$content;

__________________
La muerte es un camino que todos debemos recorrer...

Última edición por djreficul; 09/08/2006 a las 11:11
  #4 (permalink)  
Antiguo 09/08/2006, 11:13
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por djreficul Ver Mensaje
Muchas gracias Cluster, siempre he usado el Addslashes pero no sabía nada del magic_quote_gpc. Supongo q x eso cuando recogía algo con caracteres especiales salían tantas "\" en lugar de una sola.

Pues nada, eso significa q tengo q renovar algunos scripts, jejeje.

Saludos.

AÑADO:

Con lo q acabas de enseñarme, verías correctas estas funciones?

Código PHP:
function marcar ($content) {
    
$content = (! get_magic_quotes_gpc ()) ? unhtmlentities (addslashes ($content)) : $content;
    return 
$content;
}
function 
desmarcar ($content) {
    
$content stripslashes (htmlspecialchars ($content);
    return 
$content;

Lo normal es que los servidores usen "magic_quote_gpc" a ON . .esto significa que todo dato que pasa por el URL o en formularios o son cookies (he de ahí g de GET .. p de POST y c de COOKIE .. eso es lo que significan esas letras) se "auto escapen" .. es decir .. PHP añade ya un \ a caracteres como comillas y demás ..

Pero, .. aunque sea esto lo "común" .. no te puedes fiar si el servidor X de turno tiene esa configuración como tu lo esperas .. lo ideal es "preguntar" (via la función adecuada) su valor para tomar la acción pertinente. También puedes "forzar" el estado de esa directiva con la función ini_set() .. (pero a veces no puedes "forzar" el estado de esa directiva .. así que mejor sigue siendo .. "ver" que estado tiene y actuar en consecuencia).

Esto sucede en general con muchas funcionalidades de PHP .. PHP es "altamente" configurable y por ende afecta mucho esta configuración a como se comporte cierto código.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:20.