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. Lo primero que debes comprobar es los valores que tiene la cookie, haz un var_dump($_COOKIE) para ver que datos tiene la cookie, por supuesto hazlo ...

  #61 (permalink)  
Antiguo 14/05/2010, 02:34
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Lo primero que debes comprobar es los valores que tiene la cookie, haz un var_dump($_COOKIE) para ver que datos tiene la cookie, por supuesto hazlo desde la página que no funciona.


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

Me muestra

array(0) { }

Es decir, que esta vacio.. :S!

Sin embargo en el panel de administración, antes de dirigirme a usuarios.php

array(2) { ["usNick"]=> string(x) "x" ["usPass"]=> string(x) "x" }
  #63 (permalink)  
Antiguo 14/05/2010, 02:44
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Prueba cambiado los setcookies de la página de login por estos:

Código PHP:
setcookie("usNick",$nickN,time()+36000"/");
setcookie("usPass",$passN,time()+36000"/"); 
Por lo que me has comentado el script que crea las cookies seguramente esté en un directorio, cuando las cookies son creadas en cierto directorio solo son válidas para ese directorio al menos que se lo indiques en el parámetro path.

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

Cita:
Iniciado por Heli0s Ver Mensaje
Prueba cambiado los setcookies de la página de login por estos:

Código PHP:
setcookie("usNick",$nickN,time()+36000"/");
setcookie("usPass",$passN,time()+36000"/"); 
Por lo que me has comentado el script que crea las cookies seguramente esté en un directorio, cuando las cookies son creadas en cierto directorio solo son válidas para ese directorio al menos que se lo indiques en el parámetro path.

Un saludo
Eeeeeeeeso es, a eso me refería.

Voy a probar.

Eres un crack macho menudo fenomeno.
  #65 (permalink)  
Antiguo 14/05/2010, 02:51
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
Eeeeeeeeso es, a eso me refería.

Voy a probar.

Eres un crack macho menudo fenomeno.
Ahora si funciona, eres la ostia macho, eso si.. me resuelves tu todos los problemas, tienes que estar hasta la poya de mi jajajaja no te ayuda nadie XD
  #66 (permalink)  
Antiguo 14/05/2010, 02:52
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
Ahora si funciona, eres la ostia macho, eso si.. me resuelves tu todos los problemas, tienes que estar hasta la poya de mi jajajaja no te ayuda nadie XD
Para eso está el foro, jeje.

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

Bueno, ahora te planteo una duda y un problema.

Problema

Con IE7, ahora no me coge las cookies en administracion.php que esta en el mismo directorio que se crean las cookies, pero si me las coge en otro directorio como es el de usuarios.

Es por lo de la barra "/" esa que añadimos a las cookies con mozilla si funciona pero con ie no :S




Ahora la duda;

Para insertar seguridad a un sistema de Id's (para lo de las noticias vamos)
con utilizar

$var = (int)$_GET['id'];

es suficiente? o tambien utilizo lo de

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
}
  #68 (permalink)  
Antiguo 14/05/2010, 03:18
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
Con IE7, ahora no me coge las cookies en administracion.php que esta en el mismo directorio que se crean las cookies, pero si me las coge en otro directorio como es el de usuarios.

Es por lo de la barra "/" esa que añadimos a las cookies con mozilla si funciona pero con ie no :S
¿No funcionan en la misma carpeta que han sido creadas pero si en otras carpetas? ¿Te refieres a eso?

Cita:
Iniciado por Flow89 Ver Mensaje
Para insertar seguridad a un sistema de Id's (para lo de las noticias vamos)
con utilizar

$var = (int)$_GET['id'];

es suficiente? o tambien utilizo lo de

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
}
Todo depende, ¿Quieres tener algún tipo de log donde se te informe de ese tipo de comportamiento?, si es así, el segundo método que es el que te permite usar un condicional, pero en vez de is_numeric te recomiendo que uses is_int, ya que is_numeric permite números como 0,232424 y no creo que ese número vaya a ser el de una ID, is_int solo admite enteros, 0,1,2,3,4, etc.

Si no te hace falta tener un log de ese tipo de comportamiento, el primer método es completamente seguro, obligará a que sea int, si te enviasen un string así: 12prueba el resultado sería 12, si te enviasen algo asi: prueba12 el resultado sería 0, pero siempre devolverá un número entero.

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

Cita:
Iniciado por Flow89 Ver Mensaje
Bueno, ahora te planteo una duda y un problema.

Problema

Con IE7, ahora no me coge las cookies en administracion.php que esta en el mismo directorio que se crean las cookies, pero si me las coge en otro directorio como es el de usuarios.

Es por lo de la barra "/" esa que añadimos a las cookies con mozilla si funciona pero con ie no :S




Ahora la duda;

Para insertar seguridad a un sistema de Id's (para lo de las noticias vamos)
con utilizar

$var = (int)$_GET['id'];

es suficiente? o tambien utilizo lo de

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
}

He decidido utilizar mejor el if, y he encontrado este codigo por internet

Código PHP:
function getRealIP()
{

   if( 
$_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
   {
      
$client_ip =
         ( !empty(
$_SERVER['REMOTE_ADDR']) ) ?
            
$_SERVER['REMOTE_ADDR']
            :
            ( ( !empty(
$_ENV['REMOTE_ADDR']) ) ?
               
$_ENV['REMOTE_ADDR']
               :
               
"unknown" );

      
// los proxys van añadiendo al final de esta cabecera
      // las direcciones ip que van "ocultando". Para localizar la ip real
      // del usuario se comienza a mirar por el principio hasta encontrar
      // una dirección ip que no sea del rango privado. En caso de no
      // encontrarse ninguna se toma como valor el REMOTE_ADDR

      
$entries split('[, ]'$_SERVER['HTTP_X_FORWARDED_FOR']);

      
reset($entries);
      while (list(, 
$entry) = each($entries))
      {
         
$entry trim($entry);
         if ( 
preg_match("/^([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)/"$entry$ip_list) )
         {
            
// http://www.faqs.org/rfcs/rfc1918.html
            
$private_ip = array(
                  
'/^0\\./',
                  
'/^127\\.0\\.0\\.1/',
                  
'/^192\\.168\\..*/',
                  
'/^172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\..*/',
                  
'/^10\\..*/');

            
$found_ip preg_replace($private_ip$client_ip$ip_list[1]);

            if (
$client_ip != $found_ip)
            {
               
$client_ip $found_ip;
               break;
            }
         }
      }
   }
   else
   {
      
$client_ip =
         ( !empty(
$_SERVER['REMOTE_ADDR']) ) ?
            
$_SERVER['REMOTE_ADDR']
            :
            ( ( !empty(
$_ENV['REMOTE_ADDR']) ) ?
               
$_ENV['REMOTE_ADDR']
               :
               
"unknown" );
   }

   return 
$client_ip;


Lo que hace es recoger la ip, aunque navegue por proxy.

El asunto sería.. el codigo final como quedaría?

if(!is_int($_GET['id'])){
die("La variable ID contiene caracteres no permitidos");
include("cazaIP.php");
$victima = getRealIp();
$sql = "INSERT INTO ips (ip,incidente) VALUES('$victima','intento de Inyeccion SQL')";
mysql_query($sql);
}

Algo así funcionaría??


Ah, y sí, me refiero a eso, en Internet Explorer ahora no me coge las cookies en el mismo directorio pero si en otros.
  #70 (permalink)  
Antiguo 14/05/2010, 03:26
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Desde luego que funcionaria.

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

1.Que podemos hacer respecto a lo de las cookies?

2.Cual sería la sintaxis correcta para que eso funcionase? xDD. Dudo mucho que la que puse yo funcione... jejeje
  #72 (permalink)  
Antiguo 14/05/2010, 03:35
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
1.Que podemos hacer respecto a lo de las cookies?
Tienes que darme más detalles de cuando falla y cuando no, y revisa que borraste las cookies y las volviste a crear, con todos los navegadores con los que estés realizando las pruebas.

Cita:
Iniciado por Flow89 Ver Mensaje
2.Cual sería la sintaxis correcta para que eso funcionase? xDD. Dudo mucho que la que puse yo funcione... jejeje
La sintaxis es correcta, solo falta que después no tengas ningún fallo a la hora de escribir todo el código, pero lo que escribiste es la idea, lo único que he visto mal en eso que escribiste es que lo primero que has puesto es die("mensaje"), y recuerda que die finaliza la ejecución del script por lo tanto no se grabaría nada en la base de datos.

Además, cuanto más código escribas menos errores irás cometiendo.

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

He creado una tabla en mi bbdd que se llama, ataques y tiene los campos id, ip e incidente.

Este es el codigo de bnoticias, página en la que me salen todas las noticias y yo elijo cual borrar.
Código PHP:
<html>
<head>
<title>Panel de Administraci&oacute;n - Borrar Noticias</title><style type="text/css">
<!--
body {
    background-image: url(../imagenes/bg_pattern.gif);
}
-->

</style>
<script type="text/javascript" src="scripts/widgEditor.js"></script>
<link href="css/widgEditor.css" rel="stylesheet" type="text/css" /> 
<link href="css/widgContent.css" rel="stylesheet" type="text/css" /> 
<link href="css/main.css" rel="stylesheet" type="text/css" /> 
<link href="css/info.css" rel="stylesheet" type="text/css" /> 
<link href="../css/general.css" rel="stylesheet" type="text/css" /> 

</head>
<body>
<table width="200" border="0" align="center">
  <tr>
    <td><img src="http://www.forosdelweb.com/f18/imagenes/panel.png" width="500" height="200"></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><div align="center" class="Estilo16 Estilo40">Borra Las Noticias | <a href='../loginpanel/administracion.php'> Volver </a></div></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr><td>
<?php

//Nos comenectamos a la BBDD.
include("conex.php");

//Recogemos la variable PAGS.
$pags=$_GET[pags];

//Propiedades de Paginacion.
if (!isset($pags))
$pags 0;
$cantidad 10;
$inicial $pags $cantidad;

//Realizamos la busqueda en la BBDD.
$noticias=mysql_query("SELECT * FROM noticias ORDER BY fecha DESC LIMIT $inicial,$cantidad"$connect);
$totalnoticias=mysql_num_rows($noticias);

//Calculamos el numero de páginas a mostrar.
$contar=mysql_query("SELECT * FROM noticias",$connect);
$totalpaginas=mysql_num_rows($contar);
$paginas intval($totalpaginas $cantidad);

//Imprimimos los resultados.
while ($row=mysql_fetch_array($noticias))
{echo 
"<span class=\"Estilo35\"><img src=\"../imagenes/prueba2.png\" width=\"50\" height=\"50\">" .$row[titulo]."</span><br><p>" .$row[noticia]."</p><br><div> Por: ".$row[autor]." | "
      
.date("d-m-Y",$row[fecha])." | Categoria: ".$row[categoria]." | <a href=\"borrar.php?id=".$row[id_noticia]."\">Borrar</a></div><br><div align=\"center\"><img src=\"../imagenes/separador.png\" width=\"400\" height=\"15\"></div>";
}
echo 
"<br>";

//Creamos los enlaces, Anterior/Siguiente.
echo "<center><p>";
if (
$pags <>0)
{
$url $pags 1;
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$url."'> Anterior « </a></font>";
}
else {
echo 
" ";
}
for (
$i 0$i<($paginas 1); $i++) {
if (
$i == $pags) {
echo 
"<font><b>$i</b></font>";
}
else {
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$i."'>" .$i"</a></font>";
}
}
if (
$pags $paginas) {
$url $pags 1;
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$url."'> » Siguiente </a></font>";
}
else {
echo 
" ";
}
echo 
"</p></center>";
?></td>
  </tr>
</table>
</body>
</html>
Este es el código que tengo en borrar.php

Código PHP:
  <?
      
//recibimos la variable $id
      
$id$_GET['id'];

//Incluimos el archivo de conexion
    
include ("conex.php");

//comprobamos la variable $id
    
if(!is_int($id)){
    include(
"cazaips.php");
    
$victima $client_ip;
    
$sql "INSERT INTO ataques (ip,incidente) VALUES('$victima','intento de Inyeccion SQL')";
    
mysql_query($sql);
    die(
"La variable ID contiene caracteres no permitidos");
    }
      

//borramos los registros pertenecientes a la id
      
mysql_query("delete from noticias where id_noticia='$id'",$connect);
      
header("location: ../index.php");
      
?>

Y bueno el codigo del script lo tienes un pelin más arriba pero lo vuelvo a poner:

Código PHP:
 <?php
function getRealIP()
{

   if( 
$_SERVER['HTTP_X_FORWARDED_FOR'] != '' )
   {
      
$client_ip =
         ( !empty(
$_SERVER['REMOTE_ADDR']) ) ?
            
$_SERVER['REMOTE_ADDR']
            :
            ( ( !empty(
$_ENV['REMOTE_ADDR']) ) ?
               
$_ENV['REMOTE_ADDR']
               :
               
"unknown" );

      
// los proxys van añadiendo al final de esta cabecera
      // las direcciones ip que van "ocultando". Para localizar la ip real
      // del usuario se comienza a mirar por el principio hasta encontrar
      // una dirección ip que no sea del rango privado. En caso de no
      // encontrarse ninguna se toma como valor el REMOTE_ADDR

      
$entries split('[, ]'$_SERVER['HTTP_X_FORWARDED_FOR']);

      
reset($entries);
      while (list(, 
$entry) = each($entries))
      {
         
$entry trim($entry);
         if ( 
preg_match("/^([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)/"$entry$ip_list) )
         {
            
// http://www.faqs.org/rfcs/rfc1918.html
            
$private_ip = array(
                  
'/^0\\./',
                  
'/^127\\.0\\.0\\.1/',
                  
'/^192\\.168\\..*/',
                  
'/^172\\.((1[6-9])|(2[0-9])|(3[0-1]))\\..*/',
                  
'/^10\\..*/');

            
$found_ip preg_replace($private_ip$client_ip$ip_list[1]);

            if (
$client_ip != $found_ip)
            {
               
$client_ip $found_ip;
               break;
            }
         }
      }
   }
   else
   {
      
$client_ip =
         ( !empty(
$_SERVER['REMOTE_ADDR']) ) ?
            
$_SERVER['REMOTE_ADDR']
            :
            ( ( !empty(
$_ENV['REMOTE_ADDR']) ) ?
               
$_ENV['REMOTE_ADDR']
               :
               
"unknown" );
   }

   return 
$client_ip;

}  
?>

El caso es que SIEMPRE me sale el mensaje, y en la BBDD me aparecen campos, id (Se autoincrementa) IP con el valor 0 en todas y el incidente Ataque Inyeccion SQL.

Bueno, con esto ya se que el script no funciona correctamente ya que no coge la ip, luego buscare otra manera, pero lo que me interesa es ..

Porque siempre muestra el mensaje?
  #74 (permalink)  
Antiguo 14/05/2010, 04:33
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Me acabo de fijar que cualquier cosa pasada por GET o por POST la devuelve como string, si metes un número devolverá un string conteniendo esos números, entonces se me ha ocurrido una expresion regular que examine que solo tenga números.

Código PHP:
if(preg_match("/^[0-9]+$/"$_GET['id']) != 0){
    echo 
"Valido";
} else {
    echo 
"No Valido";

Si quieres usar el método de IF puedes usar la expresion, el otro método de poner (int) sigue siendo igual de válido y es completamente funcional, el problema es que no hay método para avisarte.
  #75 (permalink)  
Antiguo 14/05/2010, 04:54
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

He echo esto, pero no funciona xD

Código PHP:
 <?
      
//recibimos la variable $id
      
$id$_GET['id'];

//Incluimos el archivo de conexion
    
include ("conex.php");

//comprobamos la variable $id

if(preg_match("/^[0-9]+$/"$_GET['id']) != 0){
    echo 
"mysql_query("delete from noticias where id_noticia='$id'",$connect)";
    echo 
"header("location: ../index.php")";
} else {
    echo 
"include("cazaips.php");
    $victima = $client_ip;
    $sql = "
INSERT INTO ataques (ip,incidenteVALUES('$victima','intento de Inyeccion SQL')";
    mysql_query($sql);
    die("
La variable ID contiene caracteres no permitidos")";
}  
     
?>

PHP Error Message

Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /home/a7366460/public_html/noticias/borrar.php on line 11
  #76 (permalink)  
Antiguo 14/05/2010, 05:04
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Ala que bestia eres xD, si antes lo habías puesto bien, ¿Por que usas echos? La función echo es para mostrar algo en pantalla, acaso quieres mostrar la consulta en pantalla? ¿O mostrar un include en pantalla? Rectifica todos esos echos.


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

Cita:
Iniciado por Heli0s Ver Mensaje
Ala que bestia eres xD, si antes lo habías puesto bien, ¿Por que usas echos? La función echo es para mostrar algo en pantalla, acaso quieres mostrar la consulta en pantalla? ¿O mostrar un include en pantalla? Rectifica todos esos echos.


Un saludo
jajajajaj te he echo hasta reirte de las burradas que pongo jajajjaja

ya funciona perfecto.
  #78 (permalink)  
Antiguo 14/05/2010, 05:44
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Al archivo de las noticias no se lo puedo hacer no?
Porque si no, si utilizo algun caracter o alguna etiqueta de HTMl para poner las noticias, luego no sale... o si? xDD
  #79 (permalink)  
Antiguo 14/05/2010, 05:58
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Eso es solo para datos numéricos como indica la expresión regular.

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

Cita:
Iniciado por Heli0s Ver Mensaje
Eso es solo para datos numéricos como indica la expresión regular.

Un saludo
Quiero decir el aplicarle seguridad, ya sea mysql_real_escape_string etc.. no la expresion regular.
  #81 (permalink)  
Antiguo 14/05/2010, 07:01
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Entonces claro que puedes, y debes, aún es más peligroso si el texto que introduces en la base de datos es mostrado en público.

Un saludo
  #82 (permalink)  
Antiguo 14/05/2010, 15:10
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 15 años
Puntos: 16
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
Disculpa, Helios, me lo puedes explicar? Sé que es para comprobar los post get... pero lo que no entiendo exactamente que hace el array y como llamas a la función(no estoy muy familiarizado con estas)
__________________
Tengo una pregunta que a veces me tortura... ¿El loco soy yo o los locos son los demás?
  #83 (permalink)  
Antiguo 15/05/2010, 13:04
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Este script no se usa de ninguna manera, ya hace el trabajo que tiene que hacer solo, primero definimos una función para procesar datos y devolverlos modificados, en este caso modificados a una manera más "segura".

Después lo que hacemos es una vez modificados volver a ponerlos en los arrays globales, para que se puedan seguir usando como si no hubiese pasado nada, array_map lo que hace es pasar todos los elementos del array que le indiques en el parámetro dos por la función que le indiques en el parámetro uno.

Un saludo
  #84 (permalink)  
Antiguo 15/05/2010, 13:53
 
Fecha de Ingreso: mayo-2010
Mensajes: 51
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: Seguridad en PHP [Importante];

Flow89, siento que te has aprovechado de la generosidad de Heli0s.

Las preguntas que se hacen en el foro son para problemas concretos, pero Heli0s te ha venido a dar clases particulares de PHP.

No te detenías a ver tu código e identificar cuál era el fallo, lo digo porque a veces preguntabas sobre tu error cuando era que no cerrabas un echo con su ;.

Empápate un poco más en PHP y procura utilizar más el ensayo y error.

Por cierto, cada vez que quieran un mysql_real_escape_string les recomiendo crear una función con un nombre más cortito, por ejemplo:

Código PHP:
    function safe($value)
            {
            return 
mysql_real_escape_string($value);
            } 
Así te ahorras unos cuantos tecleos.

¡Saludos!
  #85 (permalink)  
Antiguo 17/05/2010, 01:33
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Luisus Ver Mensaje
Flow89, siento que te has aprovechado de la generosidad de Heli0s.

Las preguntas que se hacen en el foro son para problemas concretos, pero Heli0s te ha venido a dar clases particulares de PHP.

No te detenías a ver tu código e identificar cuál era el fallo, lo digo porque a veces preguntabas sobre tu error cuando era que no cerrabas un echo con su ;.

Empápate un poco más en PHP y procura utilizar más el ensayo y error.

Por cierto, cada vez que quieran un mysql_real_escape_string les recomiendo crear una función con un nombre más cortito, por ejemplo:

Código PHP:
    function safe($value)
            {
            return 
mysql_real_escape_string($value);
            } 
Así te ahorras unos cuantos tecleos.

¡Saludos!
No te voy a negar que desde un primer momento Heli0s me ha dado muchísimo apoyo, ya que no tenia ni idea de PHP y gracias a él ahora más o menos me defiendo.

Pero tampoco estoy de acuerdo contigo en lo de los errores. Posteo todos los errores, sean cuales sean, sea sintaxis o sea de cualquier tipo. Pues creo que a la gente le puede servir en cualquier momento.

Y si le has echado un vistazo al post, verás que tambien hay muchos errores que posteo, y los corrijo yo mismo posteando también el resultado de como debería quedar, por si alguien lo quiere utilizar.

En todo caso, creo que quien debe decir algo al respecto es Heli0s que es el afectado, el ya sabe que estoy sumamente agradecido y lo seguire estando por todo el apoyo y el conocimiento que estoy ganando gracias a el, que es un crack!



Bueno dejando de lado ese tema, seguiré con la seguridad.

Respecto a usar una funcion para guardar una variable.. nose, puede ser util la verdad, me ahorrará tiempo, puede que lo aplique, gracias por el consejo.

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

Bueno, he aplicado seguridad al php que utilizo para crear las noticias.

Este es el codigo:

Código PHP:
<?
    
//incluimos el archivo de conexion
    
include ("conex.php");

      
//recibimos las variables enviadas por el formulario
      
$titulo=$_POST[titulo];
      
$autor=$_POST[autor];
      
$categoria=$_POST[categoria];
      
$articulo=$_POST[articulo];
      
$now time();

//Limpiamos las variables
$tituloL htmlentities($titulo);
$autorL htmlentities($autor);
$categoriaL htmlentities($categoria);
$articuloL htmlentities($articulo);
    

      
//insertamos los registros almacenados en las variables
      
mysql_query("insert into noticias(autor,titulo,categoria,fecha,noticia) 
      values('$autorL','$tituloL','$categoriaL','$now','$articuloL')"
,$connect); 
      
header("location: ../index.php");
?>

Y me lo guarda en la base de datos de esta manera:
Código:
&lt;p&gt;&lt;strong&gt;asdasdasd&lt;/
strong&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;
sadasdasdasdasdasd&lt;br /&gt;&lt;br /&gt;
&lt;/em&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;asd&lt;
/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;li&gt;asdasd&lt;/
li&gt;&lt;/ul&gt;&lt;p&gt;^, : ; ? &iquest; $ % 
&amp;amp; asdasd m&aacute;s&lt;/p&gt;
Es decir, remplazando etiquetas y caracteres, que es lo que buscamos para evitar ataques, no?

El caso es que luego, al mostrarlo en el index.php me sale así:

Código:
<p><strong>asdasdasd</strong></p>
<p><em>sadasdasdasdasdasd<br /><br />
</em></p><ol><li>asd</li></ol><ul><li>asdasd</li>
</ul><p>^, : ; ? ¿ $ % &amp; asdasd más</p>
Pero no me procesa las etiquetas... sino que me salen escritas.

He echo algo mal, debo utilizar un mysql_real_escape_String en vez de htmlentities.. o que es lo que tengo que hacer exactamente? :S


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

A expensas de que alguien me ayude a arreglar ese pequeño problemilla que ha surgido, sigo avanzando con la seguridad y..

Me recomendáis encriptar las contraseñas? (Ya sea en md5 o sha-1 o cualquiera).

El caso, es que si, encriptadas son mas seguras, pero no se pueden desencriptar, si a algún usuario se le olvida la contraseña, no la puede recuperar.. xD
Entonces no se si merecerá la pena o no...

¿Que opinais?

Un saludo.
__________________
Seamos realistas. Busquemos lo imposible. ;)
La forma de dar las gracias en este foro, es dando Karma, aunque a veces con un simple Gracias, basta.
  #88 (permalink)  
Antiguo 17/05/2010, 05:19
 
Fecha de Ingreso: diciembre-2009
Mensajes: 612
Antigüedad: 15 años
Puntos: 16
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por Flow89 Ver Mensaje
A expensas de que alguien me ayude a arreglar ese pequeño problemilla que ha surgido, sigo avanzando con la seguridad y..

Me recomendáis encriptar las contraseñas? (Ya sea en md5 o sha-1 o cualquiera).

El caso, es que si, encriptadas son mas seguras, pero no se pueden desencriptar, si a algún usuario se le olvida la contraseña, no la puede recuperar.. xD
Entonces no se si merecerá la pena o no...

¿Que opinais?

Un saludo.
Tampoco tienes por qué hacerlo.

Yo he creado un sistema con contraseñas encriptadas sha-1, y lo único que cuando se olvidan se tiene que generar otra. En mi caso es sencillo porque las crea el admin y no se mandan al correo xD

Aunque te cuesta más hacer un panel de edicción rápida de usuarios, que te aparezcan registros y las contraseñas solo se cambian si pone algo xD
__________________
Tengo una pregunta que a veces me tortura... ¿El loco soy yo o los locos son los demás?
  #89 (permalink)  
Antiguo 17/05/2010, 05:40
Avatar de Flow89  
Fecha de Ingreso: abril-2010
Ubicación: Valladolid
Mensajes: 346
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Seguridad en PHP [Importante];

Cita:
Iniciado por millan2525 Ver Mensaje
Tampoco tienes por qué hacerlo.

Yo he creado un sistema con contraseñas encriptadas sha-1, y lo único que cuando se olvidan se tiene que generar otra. En mi caso es sencillo porque las crea el admin y no se mandan al correo xD

Aunque te cuesta más hacer un panel de edicción rápida de usuarios, que te aparezcan registros y las contraseñas solo se cambian si pone algo xD
Ya tengo creado el panel, te dejo el código por si te sirve de algo.


Aquí te muestra todos los usuarios para que elijas el que quieres modificar, solo te lo muestra si estas logueado, sino te redirecciona, ademas los resultados estan paginados :
Código PHP:
<?php
include("login.php");
if(
$loginCorrecto)
  { 
?>

<html>
<head>
<title>Panel de Administraci&oacute;n - Borrar Noticias</title><style type="text/css">
<!--
body {
    background-image: url(../imagenes/bg_pattern.gif);
}
-->

</style>
<script type="text/javascript" src="scripts/widgEditor.js"></script>
<link href="css/widgEditor.css" rel="stylesheet" type="text/css" /> 
<link href="css/widgContent.css" rel="stylesheet" type="text/css" /> 
<link href="css/main.css" rel="stylesheet" type="text/css" /> 
<link href="css/info.css" rel="stylesheet" type="text/css" /> 
<link href="../css/general.css" rel="stylesheet" type="text/css" /> 

</head>
<body>
<table width="550" border="0" align="center">
  <tr>
    <td><img src="http://www.forosdelweb.com/f18/imagenes/panel.png" width="550" height="200"></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><div align="center" class="Estilo16 Estilo40">Borra un Usuario | <a href='../loginpanel/administracion.php'> Volver </a></div></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr><td><table width="550" border="1" align="center">
<tr align="center" class="estilo16"><td><b> Nick </b></td><td><b> Password </b></td><td><b> Nombre </b></td><td><b> Email </b></td><td><b> Borrar </b></td></tr>
<?php

//Nos comenectamos a la BBDD.
include("conex.php");

//Recogemos la variable PAGS.
$pags=$_GET[pags];

//Propiedades de Paginacion.
if (!isset($pags))
$pags 0;
$cantidad 10;
$inicial $pags $cantidad;

//Realizamos la busqueda en la BBDD.
$usuarios=mysql_query("SELECT * FROM usuarios ORDER BY nick DESC LIMIT $inicial,$cantidad"$connect);
$totalnoticias=mysql_num_rows($usuarios);

//Calculamos el numero de páginas a mostrar.
$contar=mysql_query("SELECT * FROM usuarios",$connect);
$totalpaginas=mysql_num_rows($contar);
$paginas intval($totalpaginas $cantidad);

//Imprimimos los resultados.
while ($row=mysql_fetch_array($usuarios)){
echo 
"<tr align=\"center\"><td width=\"100\">".$row[nick]."</td><td width=\"100\">".$row[password]."</td><td width=\"100\">".$row[nombre]."</td><td width=\"200\">".$row[email]."</td><td width=\"50\" class=\"estilo16\"><a href=\"editar.php?id=".$row[id]."\">Editar</a></td></tr>";
}
echo 
"<br>";

echo 
"<tr>";

//Creamos los enlaces, Anterior/Siguiente.
echo "<center><p>";
if (
$pags <>0)
{
$url $pags 1;
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$url."'> Anterior « </a></font>";
}
else {
echo 
" ";
}
for (
$i 0$i<($paginas 1); $i++) {
if (
$i == $pags) {
echo 
"<font><b>$i</b></font>";
}
else {
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$i."'>" .$i"</a></font>";
}
}
if (
$pags $paginas) {
$url $pags 1;
echo 
"<font><a href='noticiero.php?id=".$id."&pags=".$url."'> » Siguiente </a></font>";
}
else {
echo 
" ";
}
echo 
"</p></center>";

echo 
"</tr>";
?></table></td>
  </tr>
</table>
<?php  }
//si no lo esta, mostramos este error
  
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>";
  }
?>
</body>
</html>

En este (el formulario) editas los datos:
Código PHP:
<?php
include("login.php");
if(
$loginCorrecto)
  { 
?>

<html>
<head>
<title>Panel de Administracion - Noticias</title>
<script type="text/javascript" src="scripts/widgEditor.js"></script>
<link href="css/widgEditor.css" rel="stylesheet" type="text/css" /> 
<link href="css/widgContent.css" rel="stylesheet" type="text/css" /> 
<link href="css/main.css" rel="stylesheet" type="text/css" /> 
<link href="css/info.css" rel="stylesheet" type="text/css" /> 
<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 id="gnoticias">
<?
      
//recibimos la variable id enviada en el enlace por GET
      
$id=$_GET[id];
       include (
"conex.php");
      
//hacemos las consultas
      
$result=mysql_query("select * from usuarios where id='$id'",$connect);
      
//Una vez seleccionados los registros los mostramos para su edición
      
while($row=mysql_fetch_array($result)) {
      echo 
"<div id=\"gnoticias\">
<table width=\"650\" border=\"0\" align=\"center\">
    <tr>
      <td colspan=\"2\"><div align=\"center\"><img src=\"../imagenes/panel.png\" width=\"500\" height=\"200\" /></div></td>
<tr>
    <td><div align=\"center\" class=\"Estilo16 Estilo40\">Edita un Usuario | <a href='../loginpanel/administracion.php'> Volver </a></div></td>
  </tr>
<tr><td>
      <form action=\"edit.php\" method=\"post\">
      <input type=\"hidden\" name=\"id\" value=\""
.$row[id]."\">
<b>Nick:</b><br>
<input type=\"text\" name=\"nick\" value=\""
.$row[nick]."\"><br>
<br><b>Nombre:</b><br>
<input type=\"text\" name=\"nombre\" value=\""
.$row[nombre]."\"><br>
      <br><b>Password:</b><br>
      <input type=\"text\" name=\"password\" value=\""
.$row[password]."\"><br>
      <br><b>Email:</b><br>
      <input type=\"text\" name=\"email\" value=\""
.$row[email]."\"><br>     <br><input type=\"submit\" value=\"Guardar\" > <input name=\"restablecer\" type=\"reset\" id=\"restablecer\" value=\"Limpiar\" />
      </form>
</td></tr>
</table>"
;
      }
      
mysql_free_result($result);
      
mysql_close($connect);
      
?>
</div>
<?php  }
//si no lo esta, mostramos este error
  
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>";
  }
?>
</body>
</html>
Y este procesa la edicion:

Código PHP:
<html>
<head>
<title>Panel de Administracion - Noticias</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>
<?php
include("login.php");
if(
$loginCorrecto)
  { 
      
//recibimos las variables enviadas por el formulario
      
$id=$_POST[id];
      
$nick=$_POST[nick];
      
$password=$_POST[password];
      
$nombre=$_POST[nombre];
      
$email=$_POST[email];



    
    
//incluimos el archivo de conexion
    
include ("conex.php");

      
//modificamos los datos de la base según variables recibidas
      
mysql_query("update usuarios Set nick='$nick',password='$password',nombre='$nombre',email='$email' where id='$id'"$connect);
      
header("location: ../index.php");
}
//si no lo esta, mostramos este error
  
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>";
  }
?>
</body>
</html>

Me has dado una buena idea, con eso de que solo se modifica si escriben algo, ahora lo que puedo hacer es quitar el .$row[password]. y que no la muestre, y solo si escriben algo en ese campo se añada tambien al update.


Si dejo un campo vacio y le añado al update, es decir, $password no tiene nada porque no han escrito nada, pero en el update esta puesto $password, me reemplazaría el cntenido del campo en la bbdd y lo dejaría vacío?

Si pasase eso tendria que hacer un if, que compruebe, si $password esta vacio, un if que haga un update sin el $password, si contiene algo, else update con el $password.
__________________
Seamos realistas. Busquemos lo imposible. ;)
La forma de dar las gracias en este foro, es dando Karma, aunque a veces con un simple Gracias, basta.
  #90 (permalink)  
Antiguo 17/05/2010, 07:46
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Lo correcto es encriptarlas de una forma que no se puedan desencriptar, ya que no tienen porque ser desencriptables, esa información no debería poder ser accedida por nadie, ni siquiera por ti, y el sistema sigue siendo igual de eficaz aunque la contraseña sea desencriptable.

Sobre lo de que no te procesa las etiquetas, es que eso es precisamente lo que hace htmlentities, cambiar los signos para que las etiquetas no se procesen, para que se muestren, y de esta forma evitar los ataques XSS.

Sobre lo que dijo Luisus, cada uno puede colaborar/ayudar lo que quiera, si yo estoy colaborando de más en este post es por mi voluntad.

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 05:45.