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. Cita: Iniciado por Heli0s Lo correcto es encriptarlas de una forma que no se puedan desencriptar, ya que no tienen porque ser desencriptables, esa información ...

  #91 (permalink)  
Antiguo 18/05/2010, 01:16
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
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
Okei, entonces en el campo "noticia" tendré que quitar el Htmlentities, porque si no no puedo poner negrita etc.. Le paso por algun "filtro" el campo noticia?

Respecto a la otra duda que plantee
Cita:
Iniciado por Flow89
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?

Un saludo y gracias como siempre Heli0s.
__________________
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.
  #92 (permalink)  
Antiguo 18/05/2010, 02:10
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Tienes dos opciones.

1. Evitar que los datos que van al campo Noticia pasen por htmlentities, por lo tanto las etiquetas HTML tendrían su efecto.

2. No evitar que los datos pasen por htmlentities, pero a la hora de mostrar los datos del campo noticia, usar html_entity_decode, la cual tiene como función pasar las entidades HTML a sus caracteres correspondientes, justo la función contraria a htmlentities.

Un saludo
  #93 (permalink)  
Antiguo 18/05/2010, 02:37
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
Tienes dos opciones.

1. Evitar que los datos que van al campo Noticia pasen por htmlentities, por lo tanto las etiquetas HTML tendrían su efecto.

2. No evitar que los datos pasen por htmlentities, pero a la hora de mostrar los datos del campo noticia, usar html_entity_decode, la cual tiene como función pasar las entidades HTML a sus caracteres correspondientes, justo la función contraria a htmlentities.

Un saludo
He filtrado todos los campos excepto el de noticias, de momento lo dejaré así pero tendré en cuenta el uso de la función que me has dicho.

Un saludo.

PD: Ahora no me funciona el editar.php voy a comentar en el post de la otra vez a ver si encontramos el fallo.
__________________
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.
  #94 (permalink)  
Antiguo 18/05/2010, 05:41
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, aporto una expresion regular (Dentro de la multitud de ellas que habrá) para validar "por encima" el email.

Código PHP:
function comprobar_mail($mail){
  if (!
ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$mail)){
      return 
FALSE;
  } else {
       return 
TRUE;
  }


Ahora esta el tema de aplicarle a la pagina.

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

//recogemos las variables del formulario eliminando caracteres (Prevenir ataque SQL Inyection).
$nick mysql_real_escape_string($_POST[nick]);
$password mysql_real_escape_string($_POST[password]);
$nombre mysql_real_escape_string($_POST[nombre]);
$email $_POST[email];

//comprobamos que no hayan dejado los campos vacios
if(trim($nick) != "" && trim($password) != "" && trim($nombre) != "" && trim($email) != ""){

//buscamos el id del usuario con el nick que ha introducido
  
$sql "SELECT id FROM usuarios WHERE nick='$nick'";
  
$result mysql_query($sql);

//si sale algun resultado le mostramos el error de que ese nick ya existe
  
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
  {
//si no lo registra introduciendolo a la BBDD.
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES('$nick', '$nombre ', '$password', '$email')";   
mysql_query($sql);

// y nos redirecciona a la pagina de administracion.
  
echo "<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=../loginpanel/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);

  function 
comprobar_mail($email){
  if (!
ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$email)){
      echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=../loginpanel/administracion.php\">";
  } else {
      echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Ese email no es valido. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  }


  }
  else
  {
//si en la comprobacion de que no esten vacios los campos, ve que alguno esta vacio muestra este error
  
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();
  
?>
Pero esta mal implementado.. porque no hace nada.. xD

Echadme una mano!

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

No veo que ejecutes la funcion.
  #96 (permalink)  
Antiguo 18/05/2010, 05: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];

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

//recogemos las variables del formulario eliminando caracteres (Prevenir ataque SQL Inyection).
$nick mysql_real_escape_string($_POST[nick]);
$password mysql_real_escape_string($_POST[password]);
$nombre mysql_real_escape_string($_POST[nombre]);
$email $_POST[email];

//comprobamos que no hayan dejado los campos vacios
if(trim($nick) != "" && trim($password) != "" && trim($nombre) != "" && trim($email) != ""){

//buscamos el id del usuario con el nick que ha introducido
  
$sql "SELECT id FROM usuarios WHERE nick='$nick'";
  
$result mysql_query($sql);

//si sale algun resultado le mostramos el error de que ese nick ya existe
  
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
  {
  if (!
ereg("^([a-zA-Z0-9._]+)@([a-zA-Z0-9.-]+).([a-zA-Z]{2,4})$",$email)){
      echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=../loginpanel/administracion.php\">";
       echo 
"<table style=\"height:100%;width:100%;\"border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Ese email no es valido. <br> Seras redireccionado automaticamente.</div></td></tr></table>";
  } else {
    
//si no lo registra introduciendolo a la BBDD.
$sql "INSERT INTO usuarios (nick,password,nombre,email) VALUES('$nick', '$nombre ', '$password', '$email')";   
mysql_query($sql);

// y nos redirecciona a la pagina de administracion.
  
echo "<META HTTP-EQUIV=\"refresh\" CONTENT=\"2; url=../loginpanel/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
  {
//si en la comprobacion de que no esten vacios los campos, ve que alguno esta vacio muestra este error
  
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();
  
?>
Este es el codigo final que tengo.

el caso es que yo lo he planteado así:

- Comprueba si estan vacios los campos

---- Si no lo estan comprueba si el usuario existe

-------- Si existe da error

-------- Si no existe comprueba que el email sea valido

-------------- Si no es valido, da error

-------------- Si es valido, lo crea en la BBDD

---- Si lo estan da error.



Ahora ya funciona perfectamente :)

Heli0s muchísimas gracias tio, he aprendido mazo gracias a ti, aunque aún me queda muchísimo, no he echo más que empezar, y con cosas fáciles, pero bueno...

El caso es que analizando mi propio código y la manera en que lo había echo y tal, he ido viendo errores tanto de estructura como posibles errores de sintaxis, entonces e ido modificando hasta dar con lo correcto.
__________________
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.

Última edición por Flow89; 18/05/2010 a las 06:21
  #97 (permalink)  
Antiguo 20/05/2010, 02: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];

Bueno, ahora estoy metido tambien con un UPLOAD para php.

Para aplicarle seguridad a esto, lo que se puede hacer es restringir las extensiones no?

Voy a prohibir todas las extensiones menos estas:

Código PHP:
.zip     multipart/x-zip
.word     application/msword
.wav     audio/x-wav
.txt     text/plain
.swf     application/x-shockwave-flash
.rtf     text/richtext
.psd     application/octet-stream
.ppt     application/mspowerpoint
.pdf     application/pdf
.mpg     audio/mpeg
.mpg     video/mpeg
.mpeg     video/mpeg
.mp3     video/x-mpeg
.mp3     audio/x-mpeg-3
.mov     video/quicktime
.jpg     image/jpeg
.jpeg     image/jpeg
.avi     video/avi
.avi     video/msvideo 
La forma de implementarlas voy a utilizar esto
Código PHP:
$allowed_types = array('multipart/x-zip',
'application/msword',
'audio/x-wav',
'text/plain',
'application/x-shockwave-flash',
'text/richtext',
'application/octet-stream',
'application/mspowerpoint',
'application/pdf',
'audio/mpeg',
'video/mpeg',
'video/mpeg',
'video/x-mpeg',
'audio/x-mpeg-3',
'video/quicktime',
'image/jpeg',
'image/jpeg',
'video/avi',
'video/msvideo'); 
El caso es como implemento el array luego?

porque el php que tenia era así

Código PHP:
//compruebo si las características del archivo son las que deseo
if (!((strpos($tipo_archivo"gif") || strpos($tipo_archivo"jpeg")) && ($tamano_archivo 100000))) {
    echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }

__________________
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.

Última edición por Flow89; 20/05/2010 a las 03:00
  #98 (permalink)  
Antiguo 20/05/2010, 02:55
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Para que es ese formulario de subir archivos que permites tanta extensión? No se puede limitar su uso a ciertas extensiones?

Un saludo
  #99 (permalink)  
Antiguo 20/05/2010, 02:58
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];

Podría implementarlo a lo bestia? Es decir:

Código PHP:
if (!($tipo_archivo == $allowed_types) && ($tamano_archivo 100000)) {
    echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }

__________________
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.

Última edición por Flow89; 20/05/2010 a las 03:03
  #100 (permalink)  
Antiguo 20/05/2010, 03:00
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Así permites todas las extensiones, es peor, estoy diciendo que lo limites a ciertas extensiones.
  #101 (permalink)  
Antiguo 20/05/2010, 03:06
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
Así permites todas las extensiones, es peor, estoy diciendo que lo limites a ciertas extensiones.


Es lo que estoy intentado, aceptar solo las extensiones de el array $allowed_types, pero no el resto xDD

Puedo hacerlo así?

Código PHP:
if (($tipo_archivo != $allowed_types) && ($tamano_archivo 100000)) {
    echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }

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

ah vale, no vi bien el condicional, porque estas comparando un string con un array... eso nunca se va a cumplir, debes usar la función in_array para saber si la extension está dentro del array de las extensiones permitidas.

Un saludo
  #103 (permalink)  
Antiguo 20/05/2010, 03:12
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
ah vale, no vi bien el condicional, porque estas comparando un string con un array... eso nunca se va a cumplir, debes usar la función in_array para saber si la extension está dentro del array de las extensiones permitidas.

Un saludo
Código PHP:
if ((in_array($tipo_archivo,$allowed_types)) && ($tamano_archivo 100000)) {
    echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], $nombre_archivo)){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }

Sería así? Es que he buscado la funcion in_array pero comosiempre no lo acabo de entender del todo en php.net XD
__________________
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.
  #104 (permalink)  
Antiguo 20/05/2010, 03:28
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

Así sí esta bien
  #105 (permalink)  
Antiguo 20/05/2010, 03:48
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];

Estoy probando y no me lo sube.. siempre me tira el error

Ocurrió algún error al subir el fichero. No pudo guardarse.

te dejo los codigos :S

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

//comprobamos si esta logueado correctamente, si lo esta mostramos la pagina 
if($loginCorrecto)
{ ?>
<body>
<div id="gnoticias">
<table width="650" border="0" align="center">
    <tr>
      <td colspan="2"><div align="center"><img src="http://www.forosdelweb.com/f18/imagenes/panel.png" width="500" height="200" /></div></td>
<tr>
    <td><div align="center" class="Estilo16 Estilo40">Añade una Descarga | <a href='../loginpanel/administracion.php'> Volver </a></div></td>
  </tr>
<tr><td>
<form action="adescarga.php" method="post" enctype="multipart/form-data">
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000000000000000"><br><br>
      <b>Nombre del archivo:</b><br>
      <input type="text" name="nombre"><br><br>
      <b>Autor:</b><br>
      <input type="text" name="autor"><br><br>
      <b>Categoría:</b><br>
       <input type="text" name="categoria"><br><br>
    <b>Enviar un nuevo archivo: </b><br>
    <input name="userfile" type="file"><br> <br>
      <b>Escriba una breve descripcion</b><br>
      <textarea name="descripcion" class="widgEditor" cols="50" rows="10"></textarea><br>
      <input type="submit" value="Publicar"><br>
      </form>
</td></tr>  
</table>
</div>
<?php 
}
//si no esta logueado, le mostramos este error y le redirigimos.
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\">No estas logueado, no puedes acceder aquí.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}
?>
adescarga.php
Código PHP:
<?
//tomo el valor de un elemento de tipo texto del formulario
$nombre $_POST[nombre];
$autor $_POST[autor];
$categoria $_POST[categoria];
$descripcion $_POST[descripcion];

//Creamos el array de archivos permitidos para subir al servidor
$allowed_types = array('multipart/x-zip',
'application/msword',
'audio/x-wav',
'text/plain',
'application/x-shockwave-flash',
'text/richtext',
'application/octet-stream',
'application/mspowerpoint',
'application/pdf',
'audio/mpeg',
'video/mpeg',
'video/mpeg',
'video/x-mpeg',
'audio/x-mpeg-3',
'video/quicktime',
'image/jpeg',
'image/jpeg',
'video/avi',
'video/msvideo'); 

//datos del arhivo
$nombre_archivo $_FILES['userfile']['name'];
$tipo_archivo $_FILES['userfile']['type'];
$tamano_archivo $_FILES['userfile']['size'];
$destino '/descargas';

//compruebo si las características del archivo son las que deseo
if ((in_array($tipo_archivo,$allowed_types)) && ($tamano_archivo 10000000000000000000)) { 
    echo 
"La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table>";
}else{
    if (
move_uploaded_file($nombre_archivo"$destino/$nombre")){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }
}
?>
__________________
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.
  #106 (permalink)  
Antiguo 20/05/2010, 04:24
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];

No se que pasa, pero todos los días a esta hora se me peta la web.. jajaja xD

Bueno, despues de tener unos problemillas, e investigar probar etc, he conseguido arreglarlo y ya funciona 100% el upload, sube los ficheros etc.. (antes me los subia sin extension y cosas así xD).

os dejo el codigo por si os sirve a alguien.

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

//comprobamos si esta logueado correctamente, si lo esta mostramos la pagina 
if($loginCorrecto)
?>
<body>
<div id="gnoticias">
<table width="650" border="0" align="center">
    <tr>
      <td colspan="2"><div align="center"><img src="http://www.forosdelweb.com/f18/imagenes/panel.png" width="500" height="200" /></div></td>
<tr>
    <td><div align="center" class="Estilo16 Estilo40">Añade una Descarga | <a href='../loginpanel/administracion.php'> Volver </a></div></td>
  </tr>
<tr><td>
<form action="adescarga.php" method="post" enctype="multipart/form-data">
     <input type="hidden" name="MAX_FILE_SIZE" value="10000000000000000000"><br><br>
      <b>Titulo:</b><br>
      <input type="text" name="titulo"><br><br>
      <b>Autor:</b><br>
      <input type="text" name="autor"><br><br>
      <b>Categoría:</b><br>
       <input type="text" name="categoria"><br><br>
    <b>Enviar un nuevo archivo: </b><br>
    <input name="userfile" type="file"><br> <br>
      <b>Escriba una breve descripcion</b><br>
      <textarea name="descripcion" class="widgEditor" cols="50" rows="10"></textarea><br>
      <input type="submit" value="Subir Archivo"><br>
      </form>
</td></tr>  
</table>
</div>
<?php 
}
//si no esta logueado, le mostramos este error y le redirigimos.
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\">No estas logueado, no puedes acceder aquí.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}
?>
adescarga.php
Código PHP:
<?
//tomo el valor de un elemento de tipo texto del formulario
$titulo = ($_POST[titulo]);
$autor = ($_POST[autor]);
$categoria = ($_POST[categoria]);
$descripcion = ($_POST[descripcion]);

//Creamos el array de archivos permitidos para subir al servidor
$tipos_permitidos = array('multipart/x-zip',
'application/msword',
'audio/x-wav',
'text/plain',
'application/x-shockwave-flash',
'text/richtext',
'application/octet-stream',
'application/mspowerpoint',
'application/pdf',
'audio/mpeg',
'video/mpeg',
'video/mpeg',
'video/x-mpeg',
'audio/x-mpeg-3',
'video/quicktime',
'image/jpeg',
'image/jpeg',
'video/avi',
'video/msvideo'); 

//datos del arhivo
$nombre $_FILES['userfile']['name']; 
$nombre_archivo $_FILES['userfile']['tmp_name'];
$tipo_archivo $_FILES['userfile']['type'];
$tamano_archivo $_FILES['userfile']['size'];
$destino '../descargas';

//compruebo si las características del archivo son las que deseo
if (!(in_array($tipo_archivo,$tipos_permitidos)) && ($tamano_archivo 10000000000000000000)) { 
    echo 
"<table align=\"center\">La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos .gif o .jpg<br><li>se permiten archivos de 100 Kb máximo.</td></tr></table></table>";
}else{
    if (
move_uploaded_file($nombre_archivo"$destino/$nombre")){
       echo 
"El archivo ha sido cargado correctamente.";
    }else{
       echo 
"Ocurrió algún error al subir el fichero. No pudo guardarse.";
    }
}
?>
__________________
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.
  #107 (permalink)  
Antiguo 20/05/2010, 05:24
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];

Tengo un problemilla, el sistema funciona perfecto...

El caso es que me sube el archivo, pero no me inserta los datos en la BBDD. La consulta no da ningun error, asique no se que puede estar mal :S

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

//comprobamos si esta logueado correctamente, si lo esta mostramos la pagina 
if($loginCorrecto)
{
//tomo el valor de un elemento de tipo texto del formulario
$titulo mysql_real_escape_string($_POST[titulo]);
$autor mysql_real_escape_string($_POST[autor]);
$categoria mysql_real_escape_string($_POST[categoria]);
$descripcion mysql_real_escape_string($_POST[descripcion]);

//Creamos el array de archivos permitidos para subir al servidor
$tipos_permitidos = array('multipart/x-zip',
'application/msword',
'audio/x-wav',
'text/plain',
'application/x-shockwave-flash',
'text/richtext',
'application/octet-stream',
'application/mspowerpoint',
'application/pdf',
'audio/mpeg',
'video/mpeg',
'video/mpeg',
'video/x-mpeg',
'audio/x-mpeg-3',
'video/quicktime',
'image/jpeg',
'image/jpeg',
'video/avi',
'video/msvideo'); 

//datos del arhivo
$nombre $_FILES['userfile']['name']; 
$nombre_archivo $_FILES['userfile']['tmp_name'];
$tipo_archivo $_FILES['userfile']['type'];
$tamano_archivo $_FILES['userfile']['size'];
$destino '../descargas';

//compruebo si las características del archivo son las que deseo
if (!(in_array($tipo_archivo,$tipos_permitidos)) && ($tamano_archivo 20971520)) { 
    echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../fdescarga.php\">"
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos zip, word, wav, txt, swf, rtf, pdf, powerpoint, mpg, mp3, jpg, avi.<br><li>Se permiten archivos de 20Mb máximo.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}else{
    if (
move_uploaded_file($nombre_archivo"$destino/$nombre")){
    
$sql "INSERT INTO descargas (titulo,autor,categoria,descripcion,archivo) VALUES('$titulo', '$autor ', '$categoria', '$descripcion','$nombre')";   
     
mysql_query($sql);
    echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../loginpanel/administracion.php\">";
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El archivo a sido subido correctamente.<br> Sera redireccionado automaticamente.</div></td></tr></table>"

    }else{
     echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../fdescarga.php\">"
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Ocurrio un error, el archivo no ha sido subido. Reintentelo.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
    }
}
}
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\">No estas logueado, no puedes acceder aquí.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}
?>
A ver si me echais una manilla. Muchas gracias.


ERROR ARREGLADO
Me faltaba una comilla detras de $nombre' para cerrar la consulta y por eso no la hacia (el caso es que no daba error de sintaxis). El codigo ya lo he modificado para que lo podais copiar.
__________________
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.

Última edición por Flow89; 20/05/2010 a las 05:47
  #108 (permalink)  
Antiguo 20/05/2010, 08:26
Avatar de HiToGoRoShi  
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años, 8 meses
Puntos: 31
Respuesta: Seguridad en PHP [Importante];

Interesante el articulo, yo cuando imprimo no hago esto

Código PHP:
Ver original
  1. print $row['nombre'] $row['edad'] $row['nombre']

Sino hago asi,

Código PHP:
Ver original
  1. print $row[0] $row[1] $row[2]
  #109 (permalink)  
Antiguo 20/05/2010, 09:29
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
Me faltaba una comilla detras de $nombre' para cerrar la consulta y por eso no la hacia (el caso es que no daba error de sintaxis).
No da error de sintaxis porque es una consulta MySQL y no has usado mysql_error.


Sobre la forma de imprimir los datos, ambas son válidas, mysql_fetch_array devuelve por defecto un array con los valores escalares y asociativos.

Un saludo
  #110 (permalink)  
Antiguo 24/05/2010, 02:34
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 HiToGoRoShi Ver Mensaje
Interesante el articulo, yo cuando imprimo no hago esto

Código PHP:
Ver original
  1. print $row['nombre'] $row['edad'] $row['nombre']

Sino hago asi,

Código PHP:
Ver original
  1. print $row[0] $row[1] $row[2]
Yo lo hago así porque que creo que a la hora de, en un futuro, modificarlo sea más fácil (tanto para mi, como para otro).

De esa manera sabes exactamente lo que estas tratando en todo momento, y no tienes que andar mirando a ver que era 0, 1 etc..

Pero esta interesante saber tu manera, seguro que algunos no la sabían. (Yo la vi de suerte, y no la he utilizado aún).
__________________
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.
  #111 (permalink)  
Antiguo 24/05/2010, 02:53
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, tengo un problema con mi sistema de descargas, y tambien unas dudas.

Os dejo el codigo;

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

//comprobamos si esta logueado correctamente, si lo esta mostramos la pagina 
if($loginCorrecto)
{
//tomo el valor de un elemento de tipo texto del formulario
$titulo mysql_real_escape_string($_POST[titulo]);
$autor mysql_real_escape_string($_POST[autor]);
$categoria mysql_real_escape_string($_POST[categoria]);
$descripcion $_POST[articulo];

//Creamos el array de archivos permitidos para subir al servidor
$tipos_permitidos = array('multipart/x-zip',
'application/msword',
'audio/x-wav',
'text/plain',
'application/x-shockwave-flash',
'text/richtext',
'application/octet-stream',
'application/mspowerpoint',
'application/pdf',
'audio/mpeg',
'video/mpeg',
'video/mpeg',
'video/x-mpeg',
'audio/x-mpeg-3',
'video/quicktime',
'image/jpeg',
'image/jpeg',
'video/avi',
'video/msvideo'); 

//datos del arhivo
$nombre $_FILES['userfile']['name']; 
$nombre_archivo $_FILES['userfile']['tmp_name'];
$tipo_archivo $_FILES['userfile']['type'];
$tamano_archivo $_FILES['userfile']['size'];
$destino '../descargas';

//compruebo si las características del archivo son las que deseo
if (!(in_array($tipo_archivo,$tipos_permitidos)) && ($tamano_archivo 20971520)) { 
    echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../fdescarga.php\">"
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">La extensión o el tamaño de los archivos no es correcta. <br><br><table><tr><td><li>Se permiten archivos zip, word, wav, txt, swf, rtf, pdf, powerpoint, mpg, mp3, jpg, avi.<br><li>Se permiten archivos de 20Mb máximo.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}else{
    if (
move_uploaded_file($nombre_archivo"$destino/$nombre")){
    
$sql "INSERT INTO descargas (titulo,autor,categoria,descripcion,archivo) VALUES('$titulo', '$autor ', '$categoria', '$descripcion','$nombre')";   
     
mysql_query($sql);
    echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../loginpanel/administracion.php\">";
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">El archivo a sido subido correctamente.<br> Sera redireccionado automaticamente.</div></td></tr></table>"

    }else{
     echo 
"<META HTTP-EQUIV=\"refresh\" CONTENT=\"4; url=../fdescarga.php\">"
    echo 
"<table style=\"height:100%;width:100%;\" border=\"0\"><tr><td class=\"estilo34\"><div align=\"center\">Ocurrio un error, el archivo no ha sido subido. Reintentelo.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
    }
}
}
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\">No estas logueado, no puedes acceder aquí.<br> Seras redireccionado automaticamente.</div></td></tr></table>"
}
mysql_close();
?>
El caso es que como veis en las siguientes lineas:
Código PHP:
$titulo mysql_real_escape_string($_POST[titulo]);
$autor mysql_real_escape_string($_POST[autor]);
$categoria mysql_real_escape_string($_POST[categoria]);
$descripcion $_POST[articulo]; 
Limpio todo excepto descripción. Aunque realmente esto no me sirva de nada, porque en el login.php paso todos los $_POST por un getClearString.


Bueno, el caso es que en la bbdd, se me guarda de la forma..
Código:
  	&lt;p&gt;Prueba de imagenes con imagen que es una calavera.&lt;/p&gt;
Y a la hora de mostrarlo, se me muestra así;

[php] <p>Prueba de imagenes con imagen que es una calavera.</p> [/php

Con las <p> escritas.


Que puedo hacer para que ejecute esas líneas? :S no quiero que me muestre el <p>

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

Asegurate de que no pase por el archivo segu.php, de todos modos una opción sería pasar la variable por html_entity_decode.

Un saludo
  #113 (permalink)  
Antiguo 24/05/2010, 03:08
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
Asegurate de que no pase por el archivo segu.php, de todos modos una opción sería pasar la variable por html_entity_decode.

Un saludo
He probado con eso, pero no da resultado.

.$row[html_entity_decode(descripcion)].

me sigue apareciendo <p>
__________________
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.
  #114 (permalink)  
Antiguo 24/05/2010, 03:10
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años, 8 meses
Puntos: 40
Respuesta: Seguridad en PHP [Importante];

¿Por que se lo aplicas al string indefinido 'descripcion' y no a la variable $row['descripcion']?
  #115 (permalink)  
Antiguo 24/05/2010, 03:16
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
¿Por que se lo aplicas al string indefinido 'descripcion' y no a la variable $row['descripcion']?
No lo se, jajaja. Pero ahora ya funciona, una vez más gracias.

He mirado en la página que tenia pero no encuentro, tu sabes que tipo
(ej; 'video/mpeg'), tienen las imágenes? es decir, el de gif, png, psd etc..

Quiero permitir subir todo tipo de imágenes, pero solo e encontrado el de JPG y no se como buscarlo o donde xD.

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.
  #116 (permalink)  
Antiguo 24/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];

¿Por que no lo sacas por pantalla haciendo un $_FILES['archivo']['type'] para saber de que tipo es y saber como lo muestra?
  #117 (permalink)  
Antiguo 24/05/2010, 03:23
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
¿Por que no lo sacas por pantalla haciendo un $_FILES['archivo']['type'] para saber de que tipo es y saber como lo muestra?
Porque no llega a hacer eso, da el error antes, al comprobar que el tipo no esta en la lista de tipos.
__________________
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.
  #118 (permalink)  
Antiguo 24/05/2010, 03:26
 
Fecha de Ingreso: abril-2009
Ubicación: En dust 2
Mensajes: 149
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Seguridad en PHP [Importante];

La función mysql_real_escape_string() solo se puede utilizar cuando juegas con mysql. Mi pregunta es, ¿cuando utilizas Sql Server, que función tienes que utilizar?
  #119 (permalink)  
Antiguo 24/05/2010, 03:36
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 erevaristo Ver Mensaje
La función mysql_real_escape_string() solo se puede utilizar cuando juegas con mysql. Mi pregunta es, ¿cuando utilizas Sql Server, que función tienes que utilizar?
No he encontrado una similar, pero si que la gente utiliza

str_replace("'", "''", $data)

y la ya nombrada addslashes,

http://www.w3schools.com/php/func_string_addslashes.asp

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

Pues sobre seguridad en Sql server no estoy muy puesto, así que al leer tu pregunta me he informado, por lo visto no hay función similar, y aún usando la función de mysql_real_escape_string con sql server no añadiría seguridad, ya que los caracteres de escape son diferentes

Cita:
sql server has different escape characters than Mysql, so no, the Mysql real escape string functions won't help you there. They'll still work, but they won't give the correct escape characters.
sql server uses the ' (single quote) as the escape character, so you'll need to do a find/replace on your string to add a ' in front of all the characters sql server doesn't like. Usually an apostrophe itself is the biggest problem, so I usually use:

function escapeSingleQuotes($string){
//escapse single quotes
$singQuotePattern = "'";
$singQuoteReplace = "''";
return(stripslashes(eregi_replace($singQuotePatter n, $singQuoteReplace, $string)));
}
Traducción:

Cita:
Sql server tiene diferentes caracteres de escape que mysql, así que no, la función mysql_real_escape_string no te añadirá seguridad. Las funciones funcionarían, pero no pondrán el carácter de escape correcto.
Sql server usa la ' (comilla simple) como carácter de escape, así que necesitaras hacer una función de encontrar/reemplazar para añadir la ' en los caracteres que sql server no acepte. Normalmente un apostrofe es el mayor problema, yo normalmente uso:
function escapeSingleQuotes($string){
//escapse single quotes
$singQuotePattern = "'";
$singQuoteReplace = "''";
return(stripslashes(eregi_replace($singQuotePatter n, $singQuoteReplace, $string)));
}
Un saludo

Fuentes: http://www.webmasterworld.com/php/3487262.htm

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:47.