Foros del Web » Programando para Internet » PHP »

Seguridad en PHP [Importante];

Estas en el tema de Seguridad en PHP [Importante]; en el foro de PHP en Foros del Web. Bueno, creo este post, para que entre todos, me ayudeis a hacer segura mi página web. Es sencilla, pero mas vale prevenir que curar. Tambien ...

  #1 (permalink)  
Antiguo 12/05/2010, 04:30
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Seguridad en PHP [Importante];

Bueno, creo este post, para que entre todos, me ayudeis a hacer segura mi página web. Es sencilla, pero mas vale prevenir que curar.

Tambien espero que esto, le sirva a mucha gente a la hora de aplicarlo a su página.

Para empezar y gracias a Heli0s, se de algunas funciones que nos ayudan, pero bueno, espero que todo el mundo aporte su granito.

El tema es Evitar ataques XSS y SQL Inyection .

Mirando un poquito, he encontrado una página que comenta un poco los ataques XSS y CRSF
que son parecidos, pero diferentes, [URL="http://www.xombra.com/go_articulo.php?nota=67"]Mirad[/URL]
Esta interesante.

Pasemos a ver las funciones, que yo aporto, y espero ver las vuestras.

mysql_real_escape_string();
Código:
Escapa caracteres especiales de una cadena para su uso en una sentencia 
SQL, tomando en cuanto el juego de caracteres actual de la conexión.
strip_tags();
Código:
Elimina todas las etiquetas HTML que encuentra en el parametro 
que le pases.
htmlentities();
Código:
Sustituye todas las etiquetas HTML que encuentra por su codigo, 
para introducirlo en la BBDD.
 (ej By Heli0s: cambiara el signo < por &lt; y el signo > por &gt;)
Addslashes();
Código:
Añade barra de escape a ciertos caracteres, 
como por ejemplo a la comilla simple, '.
is_numeric(); o is_string(); etc..
Código:
Devuelve TRUE si var  es una cadena o numero 
(depende la funcion que uses), y FALSE en otro caso.
ereg(); (Expresiones regulares)
Código:
Validar campos dependiendo de lo que quieras mostrar con
expresiones regulares.
Para ver ereg, mirad esta página, esta muy bien. [URL="http://www.codenb.com/utilizando-ereg-con-expresiones-regulares-para-comprobar-strings-9/"]Click.[/URL]

Cita:
Iniciado por spider_boy;
1.- No usar HTTP_POST_VARS, HTTP_COOKIE_VARS, en cambio, usar $_POST o $_COOKIE.

2.- No usar ereg_* para expresiones regulares, en cambio, usar preg_*
Ambas están obsoletas, por ende, si se llegase a encontrar un nuevo bug o algún error en su uso, no será corregido.ç

Si entras a :

[url]http://php.net/manual/en/reserved.variables.post.php[/url]

Notarás que dice :

Código:
$_POST
$HTTP_POST_VARS [deprecated] ( obsoleto )
Y acá : [url]http://cl.php.net/manual/en/function.ereg.php[/url]

Se lee :

Código:
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.

// Traductor de Google :

Esta función es obsoleta desde PHP 5.3.0. Basándose en esta función es sumamente desalentador.
En otras palabras, no es recomendable usar funciones u otros que ya no serán mantenidos en actuales y futuras versiones de php.
Creo que estos son los más utilizados, y que aplicandolos bien, pueden llegar a dar un punto de seguridad importante a tu pagina web.

Bueno, en los siguientes posts, iré enseñando mi código y aplicando estas etiquetas, para que con ayuda de todos vosotros mejore mi página y la gente pueda tener un ejemplo de como y donde se pueden utilizar.

Un saludo y Gracias, espero que os sirva.

Última edición por Flow89; 14/05/2010 a las 01:33
  #2 (permalink)  
Antiguo 12/05/2010, 04:38
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 14 años, 4 meses
Puntos: 16
Respuesta: Seguridad en PHP [Importante];

is_numeric

También hay otras para otros tipos de datos, eso comprobaría que es un número, podriamos hacer un tuto de validación de un formulario, e incluso un formulario completo y seguro, ya que en la mayoria de las páginas te aparece muy simplificado y puede dar a error en novatos
__________________
Tengo una pregunta que a veces me tortura... ¿El loco soy yo o los locos son los demás?
  #3 (permalink)  
Antiguo 12/05/2010, 04:42
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por millan2525 Ver Mensaje
is_numeric

También hay otras para otros tipos de datos, eso comprobaría que es un número, podriamos hacer un tuto de validación de un formulario, e incluso un formulario completo y seguro, ya que en la mayoria de las páginas te aparece muy simplificado y puede dar a error en novatos
Función añadida, gracias por el aporte.
  #4 (permalink)  
Antiguo 12/05/2010, 04:44
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 14 años, 4 meses
Puntos: 16
Respuesta: Seguridad en PHP [Importante];

Por cierto, tengo una duda, y ya de paso la comento

Imaginaos(bueno, es como lo tengo), que tengo una paginación por GET con número, de esta forma
?pag=12

Con poner is_numeric es suficiente o tendré que poner también el htmlentities? :S
__________________
Tengo una pregunta que a veces me tortura... ¿El loco soy yo o los locos son los demás?
  #5 (permalink)  
Antiguo 12/05/2010, 04:47
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Para colaborar con la seguridad de las webs, decir que aparte de las funciones indicadas, que si se usasen siempre reducirían mucho las posibilidades de atacar a la web, otra posibilidad añadida a la seguridad es comprobar de que tipo son las variables externas, un ejemplo muy típico es pasar un ID por GET, de lo que haga falta, y en el 100% de los casos (excluyendo los ataques) ese ID será numérico, entonces si sabemos que siempre debe ser numérico, ¿Porque no forzar a que sea numérico, o dar un error en caso de que no lo sea?

Forzar a que un dato sea numérico:
Código PHP:
$var = (int)$_GET['id']; //si la variable empieza con numeros y despues le sigue un string solo se veran los numeros, si empieza con letras y después tiene números, su valor sera 0 
Comprobar que sea numérico:
Código PHP:
if(!is_numeric($_GET['id'])){
    die(
"La variable ID contiene caracteres no permitidos");
    
//aqui podriamos logear este comportamiento en un archivo log, guardar ip, enviarnos un email, lo que hiciese falta


Un saludo

P.D: Vaya, mientras he escrito todo esto ya han comentado esta idea, jeje

EDIT: edito para añadir que esto se podría usar con cualquier tipo de dato, no solo con numéricos, is_bool, is_int, is_float, is_numeric (este último incluye a is_int y is_float), is_string, is_array, is_object, is_resource, is_null, is_scalar.
  #6 (permalink)  
Antiguo 12/05/2010, 04:48
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por millan2525 Ver Mensaje
Por cierto, tengo una duda, y ya de paso la comento

Imaginaos(bueno, es como lo tengo), que tengo una paginación por GET con número, de esta forma
?pag=12

Con poner is_numeric es suficiente o tendré que poner también el htmlentities? :S
Esta es también una de las dudas que yo tengo, pero no he empezado con mi código asique aún no había puesto nada.

Yo pienso que con poner el is_numeric, o ereg vale, ya que este parámetro no se va a insertar en la BBDD, que si no estoy confundido, es para lo que se utiliza el htmlentities.
  #7 (permalink)  
Antiguo 12/05/2010, 04:57
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por millan2525 Ver Mensaje
Por cierto, tengo una duda, y ya de paso la comento

Imaginaos(bueno, es como lo tengo), que tengo una paginación por GET con número, de esta forma
?pag=12

Con poner is_numeric es suficiente o tendré que poner también el htmlentities? :S

Si lo compruebas con is_numeric, is_numeric solo permite numeros, 0-9 (y puntos, ya que permite datos del tipo float, si solo quereís que permita usar numeros enteros, sin datos del tipo float, usar is_int o is_integer), si la variable tiene cualquier otro carácter no se cumplirá la condición, por lo tanto con is_numeric bastaría.

Un saludo
  #8 (permalink)  
Antiguo 12/05/2010, 05:08
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Heli0s, tengo un formulario para crear usuarios;

Código PHP:
<FORM ACTION="registrar.php" METHOD="post">
   <
br>
      <
b>* Nick:</b><br><br>
 <
INPUT TYPE="text" NAME="nick" SIZE="20" MAXLENGTH="20">
   
      <
BR><br>
  
      <
b>Email:</b><br><br>
 <
INPUT TYPE="text" NAME="email" SIZE="28" MAXLENGTH="100">
   
      <
BR><br>
   
      <
b>* Password:</b><br><br>
 <
INPUT TYPE="password" NAME="password" SIZE="28" MAXLENGTH="20">
  
      <
BR><br>
   
      <
b>Nombre:</b><br><br>
 <
INPUT TYPE="text" NAME="nombre" SIZE="28" MAXLENGTH="255">
   
      <
BR><br>
  
      <
INPUT TYPE="submit" CLASS="boton" VALUE="Registrar"
La seguridad debería aplicarla en la pagina que procesa este codigo, no?

He echo lo siguiente:

Código PHP:
<?php  
  
include ("conex.php");
   function 
quitar($mensaje){

   
$mensaje str_replace("<","&lt;",$mensaje);
   
$mensaje str_replace(">","&gt;",$mensaje);
   
$mensaje str_replace("\'","'",$mensaje);
   
$mensaje str_replace('\"',"&quot;",$mensaje);
   
$mensaje str_replace("\\\\","\\",$mensaje);
  return 
$mensaje;
}
  

  if(
trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != ""){
  
$sql "SELECT id FROM usuarios WHERE nick='".quitar($HTTP_POST_VARS["nick"])."'";
  
$result mysql_query($sql);
  if(
$row mysql_fetch_array($result)){
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Error, ese nick ya ha sido registrado. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  else
  {
  
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES (";
  
$sql .= "'".quitar($HTTP_POST_VARS["nick"])."'";
  
$sql .= ",'".quitar($HTTP_POST_VARS["password"])."'";
  
$sql .= ",'".quitar($HTTP_POST_VARS["nombre"])."'";
  
$sql .= ",'".quitar($HTTP_POST_VARS["email"])."'";
  
$sql .= ")";
  
mysql_query($sql);


  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=administracion.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El registro del usuario se ha efectuado correctamente. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  
mysql_free_result($result);
  }
  else
  {
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Debes rellenar como mínimo el Nick y el Password. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
   }
  
mysql_close();
  
?>
Como veis, ya he remplazado caracteres. Ahora que más medidas de seguridad debería aplicar? Mysql_real_escape_string?

O si es mejor el HTMLEntities, que el str_replace... Como debería quedar?

Un saludo.
  #9 (permalink)  
Antiguo 12/05/2010, 05:15
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Sí, la protección se realiza en la página que procesa los datos.

Yo usaria htmlentities ya que reemplaza más caracteres y no tienes necesidad de usar funciones creadas por ti, y cualquier variable que se use en una consulta mysql (no tiene porque insertarse, en la clausula where también debe estar protegida) debería usarse mysql_real_escape_string.

Por ejemplo en tu código usaría ereg para comprobar que el campo email tiene un email y que sea correcto.
  #10 (permalink)  
Antiguo 12/05/2010, 05:18
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Código PHP:
$sql "(INSERT INTO usuarios (nick,password,nombre,email) VALUES()"
    
mysql_real_escape_string($nick),
    
mysql_real_escape_string($password),
    
mysql_real_escape_string($nombre),
    
$email,
); 

Así seria con el mysql_real_escape_string, no?
  #11 (permalink)  
Antiguo 12/05/2010, 05:20
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

La concatenación no la has realizado correctamente, de todos modos te recomiendo que no uses la función así, te recomiendo que hagas algo como:

Código PHP:
$nick mysql_real_escape_string($nick); 
Así con todas las variables, si después tienes que usar la variable en otro sitio ya tienes el trabajo hecho, y la consulta se queda más limpia y más clara.
  #12 (permalink)  
Antiguo 12/05/2010, 05:22
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Os voy a dejar un código que creo que os resultará interesante y os gustará:

Código PHP:
function getClearString($var){
    if(!
is_array($var)){
        return 
addslashes(stripslashes(htmlentities($var)));
    } else {
        return 
$var;
    }
}

$_GET array_map("getClearString"$_GET);
$_POST array_map("getClearString"$_POST);
$_COOKIE array_map("getClearString"$_COOKIE);
$_SESSION array_map("getClearString"$_SESSION); 
Eso está en un archivo, el cual incluyo en todas mis páginas, al inicio.


Un saludo
  #13 (permalink)  
Antiguo 12/05/2010, 05:27
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Bueno he editado el codigo de registrar.php

Dime que te parece ahora.

Código PHP:

<?php  
  
include ("conex.php");

if(
trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "" && trim($HTTP_POST_VARS["nombre"]) != "" && trim($HTTP_POST_VARS["email"]) != ""){
  
$sql "SELECT id FROM usuarios WHERE nick='"$HTTP_POST_VARS["nick"]"'";
  
$result mysql_query($sql);
  if(
$row mysql_fetch_array($result)){
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Error, ese nick ya ha sido registrado. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  else
  {
$sql "(INSERT INTO usuarios (nick,password,nombre,email) VALUES(
    '"
$nick mysql_real_escape_string($nick)"',
    '"
$password mysql_real_escape_string($password)"',
    '"
$nombre mysql_real_escape_string($nombre)"' ,
    '"
$email"'
)"
); 
mysql_query($sql);


  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=administracion.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El registro del usuario se ha efectuado correctamente. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  
mysql_free_result($result);
  }
  else
  {
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Debes rellenar todos los campos. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
   }
  
mysql_close();
  
?>

Echale un ojo, y me dices si esta bien lo que he modificado.

He añadido también, que sea obligatorio rellenar el nombre y el email. Aunque no se va a poder registrar nadie, excepto los de la empresa, pero bueno, jeje.

Última edición por Flow89; 12/05/2010 a las 05:41
  #14 (permalink)  
Antiguo 12/05/2010, 05:30
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Heli0s Ver Mensaje
Os voy a dejar un código que creo que os resultará interesante y os gustará:

Código PHP:
function getClearString($var){
    if(!
is_array($var)){
        return 
addslashes(stripslashes(htmlentities($var)));
    } else {
        return 
$var;
    }
}

$_GET array_map("getClearString"$_GET);
$_POST array_map("getClearString"$_POST);
$_COOKIE array_map("getClearString"$_COOKIE);
$_SESSION array_map("getClearString"$_SESSION); 
Eso está en un archivo, el cual incluyo en todas mis páginas, al inicio.


Un saludo
Muchas gracias tio.

Este archivo con hacerle un include(); ya funciona no? no hay que hacer nada mas... ni llamar a las variables de ninguna manera ni nada, no?

Un saludo Heli0s.
  #15 (permalink)  
Antiguo 12/05/2010, 05:41
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Con un simple include funciona, sí, solo hay que tener en cuenta que si pasas un array por uno de esos arrays globales, no lo procesará, simplemente lo devuelve, y por o tanto los datos de ese array no han sido procesados


Dime una cosa, el código que tienes funciona?
  #16 (permalink)  
Antiguo 12/05/2010, 05:46
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Heli0s Ver Mensaje
Con un simple include funciona, sí, solo hay que tener en cuenta que si pasas un array por uno de esos arrays globales, no lo procesará, simplemente lo devuelve, y por o tanto los datos de ese array no han sido procesados


Dime una cosa, el código que tienes funciona?
El que tenia antes si, el que tengo ahora nose, voy a hacer una copia de seguridad, y pruebo este a ver.

Me copiaré el archivo que generosamente nos has dado y lo incluiré en todas mis paginas. No creo que me de ningún problema.
  #17 (permalink)  
Antiguo 12/05/2010, 05:53
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Con este codigo:
Código PHP:
<html>
<head>
<title>JuventudMDC - Panel de Administraci&oacute;n</title>
<link href="../css/general.css" rel="stylesheet" type="text/css" />
</head>
<body>
<?php  
  
include ("conex.php");

if(
trim($HTTP_POST_VARS["nick"]) != "" && trim($HTTP_POST_VARS["password"]) != "" && trim($HTTP_POST_VARS["nombre"]) != "" && trim($HTTP_POST_VARS["email"]) != ""){
  
$sql "SELECT id FROM usuarios WHERE nick='"$HTTP_POST_VARS["nick"]"'";
  
$result mysql_query($sql);
  if(
$row mysql_fetch_array($result)){
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Error, ese nick ya ha sido registrado. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  else
  {
$sql "(INSERT INTO usuarios (nick,password,nombre,email) VALUES(
    '"
$nick mysql_real_escape_string($nick)"',
    '"
$password mysql_real_escape_string($password)"',
    '"
$nombre mysql_real_escape_string($nombre)"' ,
    '"
$email"'
)"
); 
mysql_query($sql);


  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=administracion.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El registro del usuario se ha efectuado correctamente. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
  
mysql_free_result($result);
  }
  else
  {
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=fusuarios.php\">";
echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Debes rellenar todos los campos. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
   }
  
mysql_close();
  
?>
</body>
</html>
Este error:
Parse error: syntax error, unexpected T_VARIABLE in /home/a7366460/public_html/loginpanel/registrar.php on line 11

Yo creo que esa linea esta bien :S
  #18 (permalink)  
Antiguo 12/05/2010, 05:54
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

La pregunta iba por esto:

Código PHP:
$sql "(INSERT INTO usuarios (nick,password,nombre,email) VALUES(
    '"
$nick mysql_real_escape_string($nick)"',
    '"
$password mysql_real_escape_string($password)"',
    '"
$nombre mysql_real_escape_string($nombre)"' ,
    '"
$email"'
)"
); 
Así a simple vista creo que está mal, y lioso.

Lo veo mejor así:
Código PHP:
$nick mysql_real_escape_string($nick);
$password mysql_real_escape_string($password);
$nombre mysql_real_escape_string($nombre);
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES('$nick', '$nombre ', '$password', '$email')"
Un saludo
  #19 (permalink)  
Antiguo 12/05/2010, 05:59
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Heli0s Ver Mensaje
La pregunta iba por esto:

Código PHP:
$sql "(INSERT INTO usuarios (nick,password,nombre,email) VALUES(
    '"
$nick mysql_real_escape_string($nick)"',
    '"
$password mysql_real_escape_string($password)"',
    '"
$nombre mysql_real_escape_string($nombre)"' ,
    '"
$email"'
)"
); 
Así a simple vista creo que está mal, y lioso.

Lo veo mejor así:
Código PHP:
$nick mysql_real_escape_string($nick);
$password mysql_real_escape_string($password);
$nombre mysql_real_escape_string($nombre);
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES('$nick', '$nombre ', '$password', '$email')"
Un saludo
Tienes razón, de tu manera queda mas claro y más visible, pero el codigo no funciona por un error que yo no encuentro vamos.. xq esta todo igual :S
  #20 (permalink)  
Antiguo 12/05/2010, 05:59
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Creo que te complicas mucho a la hora de concatenar, mira esta linea:
Código PHP:
  $sql "SELECT id FROM usuarios WHERE nick='"$HTTP_POST_VARS["nick"]"'"
Asi está mejor:

Código PHP:
 $sql "SELECT id FROM usuarios WHERE nick='$HTTP_POST_VARS[nick]'"

Un saludo
  #21 (permalink)  
Antiguo 12/05/2010, 06:03
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Heli0s Ver Mensaje
Creo que te complicas mucho a la hora de concatenar, mira esta linea:
Código PHP:
  $sql "SELECT id FROM usuarios WHERE nick='"$HTTP_POST_VARS["nick"]"'"
Asi está mejor:

Código PHP:
 $sql "SELECT id FROM usuarios WHERE nick='$HTTP_POST_VARS[nick]'"

Un saludo
Nose, el error estaba ahí, me lio mucho con el php.... xD soy un negao jaja

Ahora funciona, pero me rellena los campos vacios en la bbdd.
  #22 (permalink)  
Antiguo 12/05/2010, 06:11
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Ya esta arreglado, lo que he echo ha sido esto:
Código PHP:
$nick mysql_real_escape_string($HTTP_POST_VARS[nick]);
$password mysql_real_escape_string($HTTP_POST_VARS[password]);
$nombre mysql_real_escape_string($HTTP_POST_VARS[nombre]);
$email $HTTP_POST_VARS[email];
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES('$nick', '$nombre ', '$password', '$email')";   
mysql_query($sql); 

Digamos que este codigo, ya esta bien protegido, No? Pufff.. pues si casi me lleva media mañana!! Ya veras cuando lleguemos a las noticias que va todo por ID y demas!jajjajaja
  #23 (permalink)  
Antiguo 12/05/2010, 06:30
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Cuando va por ID es más sencillo ya que solo recojes la ID, lo demás es de la base de datos, lo que teóricamente ya debió haber pasado por los procesos de seguridad.

Un saludo
  #24 (permalink)  
Antiguo 13/05/2010, 01:58
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Intentando mejorar mi sistema de login con seguridad, me lo he cargado xDD

A ver si me echais una mano..

Codigo que tengo ahora (no funciona);
Código PHP:
<?php
$tNick 
mysql_real_escape_string($HTTP_POST_VARS["usNick"]);
$tPass mysql_real_escape_string($HTTP_POST_VARS["usPass"]);

$result mysql_query("SELECT * FROM usuarios WHERE nick='$tNick' AND password='$tPass'");
$rows mysql_fetch_array($result);
    if(
mysql_num_rows($result) == 1){
        
$loginCorrecto true;
    } else {
        
$loginCorrecto false;
    }
mysql_free_result($result);
  
?>

Codigo que tenia antes (si funciona);
Código PHP:
<?php
   $loginCorrecto 
false;
$result mysql_query("SELECT * FROM usuarios WHERE nick='".
$HTTP_COOKIE_VARS["usNick"]."' AND password='".$HTTP_COOKIE_VARS["usPass"]."'");
$rows mysql_fetch_array($result);
if(
mysql_num_rows($result) == 1){
    
$loginCorrecto true;
} else {
    
$loginCorrecto false;
}
mysql_free_result($result);
  
?>
  #25 (permalink)  
Antiguo 13/05/2010, 02:09
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Vale problema arreglado, el problema era que utilizaba $HTTP_POST_VARS en vez de $HTTP_COOKIE_VARS jejejje
  #26 (permalink)  
Antiguo 13/05/2010, 02:20
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

He utilizado tu script para limpiar, y me da errores.

Lo guarde como seguridad.php

y lo he incluido; include ("seguridad.php");

Código:
Warning: include(seguridad.php) [function.include]: 
failed to open stream: No such file or directory in 
/home/a7366460/public_html/loginpanel/ingresar.php on line 9

Warning: include() [function.include]: Failed opening 'seguridad.php' 
for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/a7366460/public_html/loginpanel/ingresar.php on line 9
  #27 (permalink)  
Antiguo 13/05/2010, 02:22
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Te da error al incluir el archivo, revisa que este en la misma carpeta y que se llame realmente seguridad.php, porque el include dice que ese archivo no existe.

Un saludo
  #28 (permalink)  
Antiguo 13/05/2010, 02:27
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
He utilizado tu script para limpiar, y me da errores.

Lo guarde como seguridad.php

y lo he incluido; include ("seguridad.php");

Código:
Warning: include(seguridad.php) [function.include]: 
failed to open stream: No such file or directory in 
/home/a7366460/public_html/loginpanel/ingresar.php on line 9

Warning: include() [function.include]: Failed opening 'seguridad.php' 
for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/a7366460/public_html/loginpanel/ingresar.php on line 9
Parece ser que no actualizaba bien el servidor y no cogia el archivo, ahora ya le coge pero no lo ejecuta, arriba de la pagina me muestra el codigo y no realiza la funcion :S

Código PHP:
function getClearString($var){ if(!is_array($var)){ return addslashes(stripslashes(htmlentities($var))); } else { return $var; } } $_GET array_map("getClearString"$_GET); $_POST array_map("getClearString"$_POST); $_COOKIE array_map("getClearString"$_COOKIE); $_SESSION array_map("getClearString"$_SESSION); function getClearString($var){ if(!is_array($var)){ return addslashes(stripslashes(htmlentities($var))); } else { return $var; } } $_GET array_map("getClearString"$_GET); $_POST array_map("getClearString"$_POST); $_COOKIE array_map("getClearString"$_COOKIE); $_SESSION array_map("getClearString"$_SESSION); 
  #29 (permalink)  
Antiguo 13/05/2010, 02:30
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

¿Te muestra la función y no lo que hay debajo? Enséñame el código a ver que tal está.

Un saludo
  #30 (permalink)  
Antiguo 13/05/2010, 02:35
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Sí, me muestra la funcion, y lo que hay debajo las dos cosas XDD

te muestro el de el panel d administracion x ej;

Código PHP:
<?php 
  
include("conex.php"); 
  include(
"login.php"); 
  include(
"seguridad.php");

  if(
$loginCorrecto)
  { 
?>
<html>
<head>
<title>JuventudMDC - Panel de Administraci&oacute;n</title>
<link href="../css/general.css" rel="stylesheet" type="text/css" />
<style type="text/css">
<!--
body {
    background-image: url(../imagenes/bg_pattern.gif);

</style></head>

<body>

<div align="center">
  <table width="200" border="0" id="general">
    <tr>
      <td colspan="3"><img src="http://www.forosdelweb.com/f18/imagenes/panel.png" width="500" height="200"></td>
    </tr>
    <tr>
      <td colspan="3">&nbsp;</td>
    </tr>
    <tr>
      <td width="161"><div align="center"><a href="http://www.forosdelweb.com/f18/noticias/administrar.php"><img src="http://www.forosdelweb.com/f18/imagenes/addnoticia.png" width="100" height="100" border="0" usemap="#Map"></a></div></td>
      <td width="162"><div align="center"><a href="http://www.forosdelweb.com/f18/noticias/enoticias.php"><img src="http://www.forosdelweb.com/f18/imagenes/editarnoticia.png" width="100" height="100" border="0" usemap="#map"></a></div></td>
      <td width="165"><div align="center"><a href="http://www.forosdelweb.com/f18/noticias/bnoticias.php"><img src="http://www.forosdelweb.com/f18/imagenes/borrar.png" width="100\" height="100" border="0" usemap="#map"></a></div></td>
    </tr>
    <tr>
      <td><div align="center" ><a href="http://www.forosdelweb.com/f18/noticias/administrar.php" class="Estilo16">Crear Noticia </a></div></td>
      <td> <div align="center" ><a href="http://www.forosdelweb.com/f18/noticias/enoticias.php" class="Estilo16">Editar Noticia </a></div></td>
      <td><div align="center" ><a href="http://www.forosdelweb.com/f18/noticias/bnoticias.php" class="Estilo16">Borrar Noticia </a></div></td>
    </tr>
    <tr><td><br></td></tr>
    <tr>
      <td width="161"><div align="center"><a href="http://www.forosdelweb.com/f18/usuarios/addusuario.php"><img src="http://www.forosdelweb.com/f18/imagenes/addusuario.png" width="100" height="100" border="0" usemap="#Map"></a></div></td>
      <td width="162"><div align="center"><a href="http://www.forosdelweb.com/f18/usuarios/eusuario.php"><img src="http://www.forosdelweb.com/f18/imagenes/editarusuario.png" width="100" height="100" border="0" usemap="#map"></a></div></td>
      <td width="165"><div align="center"><a href="http://www.forosdelweb.com/f18/usuarios/busuario.php"><img src="http://www.forosdelweb.com/f18/imagenes/borrarusuario.png" width="100" height="100" border="0" usemap="#map"></a></div></td>
    </tr>
    <tr>
      <td><div align="center" ><a href="http://www.forosdelweb.com/f18/usuarios/addusuario.php" class="Estilo16">Crear Usuario </a></div></td>
      <td><div align="center" ><a href="http://www.forosdelweb.com/f18/usuarios/eusuario.php" class="Estilo16">Editar Usuario </a></div></td>
      <td><div align="center" ><a href="http://www.forosdelweb.com/f18/usuarios/busuario.php" class="Estilo16">Borrar Usuario </a></div></td>
    </tr>
  </table>
</div>
</body>
</html>

<?php  }
  else
  {
  echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=../panel.php\">";
  echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El sistema no lo ha identificado, solo los usuarios registrados tienen acceso a esta area<br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }
?>
Un saludo

Etiquetas: funciones, medidas, securityphp, seguridad
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

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 22:02.