Bienvenido a datoweb.com!! En este foro podrás encontrar ayuda sobre diseño y desarrollo web en general. Si quieres formar parte de esta comunidad para pedir ayuda o colaborar ayudando a otros usuarios del foro solo tienes que registrarte desde el siguiente enlace: Registrarse en el Foro

DUDA!! Cuando se deben usar las funciones de php??

hola gente espero que esten muy bien, en este caso quisiera que entre todos pudieramos responder como y cuando debemos usar una funcion de php, en este caso empecemos, si no tienes la funcion GetSQLValueString que dream weaver crea, se puede usar la funcion siguien:

Mysqli_real_scape_string.
esta funcion se debe utilizar cuando vas introducir un dato en la base de datos o mejor dicho en un INSERT, pero mi duda seria, esta misma funcion se debe utilizar para en un SELECT cuando anteriormente ya se utilizo en el insert? que consecuencias traeria en caso de que ya no debe volver a usarse? o por el contrario se recomienda utilizar tambien en un select?

de ante mano gracias...
0
Puntos
1732
Visitas
6
Resp
Por Jesxs hace 100 meses
Desactivado
Respuesta #1
Usarlo tanto en INSERT como en SELECT sería lo correcto, un caso muy común es el clásico ejemplo que dan cuando se quiere explicar el SQL Injection (Inyección SQL) que es lo que se busca evitar con la función mysqli_real_scape_string.

En el caso del SELECT, toma como ejemplo un inicio de sesión. Donde validas tanto usuario como contraseña. Pero si en los input del login yo coloco ' OR '1'='1 ¿Que estaría pasando? Primero, estoy haciendo una Inyección SQL, o sea colocando condiciones SQL en la consulta. Segundo, podría entrar al Control Panel.. Y sería algo como

"SELECCIONA * en la tabla usuarios DONDE ususario enviado = usuario en la base de datos O 1=1 y si contraseña enviada = contraseña en la base de datos O 1=1".

Y como 1=1, entonces cumpliría la condición sin problemas y habré violado la seguridad.. Por eso también se debe usar mysqli_real_scape_string en una consulta SELECT.

Para algo más didáctico has el intento en éste login colocando como te dije ' OR '1'='1 pero sin modificar nada. Solo con el fin de entender la teoría, con algo de práctica. La idea siempre es saber como funcionan las cosas sin perjudicar a los demás. No estamos hablando del lado oscuro de la fuerza.

¡Feliz Navidad!
1
Puntos
Por Jose hace 100 meses
Experto Sitio web
Respuesta #2
Gracias jose, ya esta mas entendido, mira en estos momentos, estoy utilizando ambas funciones tanto GetSQLValueString como mysqli_real_scape_string, ambas funciones en un en consultas, entonces bueno he revizado un poco y parece ser que la funcion GetSQL no funciona, te dejo mi codigo:
if (!function_exists("GetSQLValueString")) {
        function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = ""){
              if (PHP_VERSION < 6) {
                $theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
              }
            global $conexion;
            $theValue = function_exists("mysqli_real_escape_string") ? mysqli_real_escape_string($conexion, $theValue) : mysqli_escape_string($conexion, $theValue);
            switch ($theType) {
                case "text":
                  $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                  break;    
                case "long":
                case "int":
                  $theValue = ($theValue != "") ? intval($theValue) : "NULL";
                  break;
                case "double":
                  $theValue = ($theValue != "") ? doubleval($theValue) : "NULL";
                  break;
                case "date":
                  $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
                  break;
                case "defined":
                  $theValue = ($theValue != "") ? $theDefinedValue : $theNotDefinedValue;
                  break;
              }
                  return $theValue;
        }
    }
sinceramente no se que ocurre, pero paraciera como si esta funcion no funcionara, por eso mi duda, otra seria que quizas estoy colocando mal el codigo de las demas funciones, como htmlentities, por ejemplo, en la todas las lineas tengo del codigo, tengo asi las funciones:
$query_example = sprintf("SELECT example FROM example2 WHERE id=%s", 
            GetSQLValueString(htmlentities(mysqli_real_escape_string($conexion, $_POST['examplename'])), "int"));
        $example = mysqli_query($conexion, $query_example) or die(mysqli_error($conexion));
        $row_example = mysqli_fetch_assoc($example);
        $totalRows_example = mysqli_num_rows($example);
teniendo asi las dos funciones antes mencionada, y ademas htmlentities, estoy un poco trabado con este tema, probablemente tengo algo mal en el codigo de la funcion GetSQLValueString, o algo estoy asiendo mal.

bien la duda seria es correcto tener tanto GetSQL como mysqli_real? si no es asi que errores o consecuencias podria traer esto?

bueno biendo un poco si revizo la funcion GetSQL y corrijo el error en dado caso de que este mal algo, entonces tendria que borrar la funcion mysqli_real_scape_string de todas las consultas e inserts de mis archivos, creo yo que ya dado que tengo GetSQL no tendria caso volver a poner la funcion mysqli_real_scape_string, o dejo ambas funciones?

y la ultima duda que he tenido, es con respecto a si htmlentities, vas dentro de GetSQLValueString o bien fuera, por ejemplo:
$query_example = sprintf("SELECT example FROM example2 WHERE id=%s", htmlentities(GetSQLValueString(mysqli_real_escape_string($conexion, $_POST['examplename'])), "int")); $example = mysqli_query($conexion, $query_example) or die(mysqli_error($conexion)); $row_example = mysqli_fetch_assoc($example); $totalRows_example = mysqli_num_rows($example);
o de la forma en como la tengo, cual seria la forma correcta?

perdonen si abeces hago preguntas que quizas son ovias, o hago preguntas tontas jaja, espero me comprendan, estoy un poco enredado con este problemita, que me recomeindan o que esta mal o bien en lo que estoy haciendo, o mas bien en el modo en como lo estoy haciendo?

de antemano, gracias.
0
Puntos
Por Jesxs hace 100 meses
Desactivado
Respuesta #3
mira he checado ambas funciones y este fue el resultado, quizas aqui esta la confucion del problema que presentaba:
les dejo la prueba que hice, me di cuenta que la funcion GetSQLValueString deja las simples comillas inicial y terminal intacta, mientras la funcion mysqli_real_escape_string si las elimina, quizs me estoy enredando mas jaja pero creo que es mejor utilizar solo la funcion mysqli_real_escape_string.
<?php
	
	$sss1 = "('hola hola'), - _ \ + /hola % * ? \/ ".'%s & "" !?\/¿?';
	$sql = mysqli_real_escape_string($conexion, $sss1);

	echo $sql.'<br/><br/><br/>';

	$sss2 = "('hola hola'), - _ \ + /hola % * ? \/ ".'%s & "" !?\/¿?';
	$sql2 = GetSQLValueString($sss2, "text");

	echo $sql2.'<br/><br/><br/>';

	$sss3 = "('hola hola'), - _ \ + /hola % * ? \/ ".'%s & "" !?\/¿?';
	$sql3 = GetSQLValueString(mysqli_real_escape_string($conexion, $sss3), "text");

	echo $sql3.'<br/><br/><br/>';
?>
y da como resultado
(\'hola hola\'), - _ \\ + /hola % * ? \\/ %s & \"\" !?\\/¿?


'(\'hola hola\'), - _ \\ + /hola % * ? \\/ %s & \"\" !?\\/¿?'


'(\\\'hola hola\\\'), - _ \\\\ + /hola % * ? \\\\/ %s & \\\"\\\" !?\\\\/¿?'
entonces creo yo, es mejor utilizar mysqli, pero que opnan ustedes, deberia eliminar GetSQLValueString y dejar solo mysqli, o por el contrario para ustedes por su uso y experiencia en mejor GetSQLValueString??

que opinan?
0
Puntos
Por Jesxs hace 100 meses
Desactivado
Respuesta #4
Hola, la función mysql_real_scape_string ya esta incluida en la función GetSQLValueString por eso no puedes usarlas juntas, por lo que comentas de mysqli tienes una guía de como pasar de mysql a mysqli de manera muy fácil en este enlace https://datoweb.com/post/2486/ejemplos-de-como-usar-mysqli-de-manera-facil

salu2
0
Puntos
Por alber hace 100 meses
Administrador
Respuesta #5
Jesx, como dice alber, no es necesario usar mysqli_real_scape_string si ya usas GetSQLValueString, o viceversa ¿Cuál usar? La que quieras.

Ahora, no es que GetSQLValueString le deje las comillas inicial y final a la cadena de texto, sino que si leemos detenidamente el código por aquí
case "text":
      $theValue = ($theValue != "") ? "'" . $theValue . "'" : "NULL";
      break;
Vemos, específicamente aquí:
"'" . $theValue . "'"
Que se le está agregando comillas simples tanto al inicio como al final, porque para eso tú indicaste que el valor es de tipo "text": GetSQLValueString($parametro, "text") ahora en cambio, si el parámetro fuese un número, aparecerá sin comillas.

Tú mismo puedes crear tu propia función para escapar caracteres, puedes llamarla EscapeDeCaracteres($parametro) y usando mysqli_real_escape_string limpiar la cadena y luego retornarla con un return.


0
Puntos
Por Jose hace 100 meses
Experto Sitio web
Respuesta #6
Hola, revisa como puedes usar la función GetSQLValueString en mysqli en este tema https://datoweb.com/post/2608/formatear-cadena-con-funcion-getsqlvaluestring-en-mysqli

salu2
0
Puntos
Por alber hace 99 meses
Administrador
Compartir en facebook
Compartir en twitter
Compartir
Para comentar Inicia sesión o Registrate