Ayuda con archivos PHP

Iniciado por antoz, 2 Octubre 2011, 20:53 PM

0 Miembros y 1 Visitante están viendo este tema.

antoz

Hola tengo que crear un archivo PHP que cumpla las siguientes características:

-Que recoja una variable mediante $_GET["archivo"].
-Que recoja otra variable mediante $_GET["pass"].
-Que para continuar leyendo código se necesite una contraseña (123456).
-Que cree un archivo llamado $archivo0 y que, en caso de que exista, se llame $archivo1, $archivo2 ... y así sucesivamente (de forma que no se repita ningún archivo).
-Que dentro del archivo se escriba $archivo.

Ahora bien, por si no me he explicado bien, lo que quiero es crear un archivo php que  recoja dos variables (archivo y pass) de la siguiente forma: http://ejemplo.com/aplicacion.php?archivo=EJEMPLO?pass=123456, que compruebe si la variable contraseña es 123456 para continuar ejecutando el código y de ser así, que se cree un archivo de texto que se llame como la variable archivo y un número más una unidad. $archivo0.txt, $archivo1.txt, $archivo2.txt... de forma que nunca se repitan los nombres de los archivos y se vayan creando nuevos.

Alguna sugerencia? Gracias de antemano.
Saludos

antoz

Esto es lo que tengo x ahora, pero no funciona:

<?
$archivo = $_GET["a"];
$password = $_GET["p"];
$nserie = $_GET["n"];
if ($password=="portoscanprivatebuild")
{
$abrir = "count.txt";
$abre = fopen($abrir, "r");
$total = fread($abre, filesize($abrir));
fclose($abre);
$abre = fopen($abrir, "w");
$total = $total + 1;
$grabar = fwrite($abre, $total);
fclose($abre);
$abrir2 = .$archivo. .$total. '.txt';
$fp = fopen($abrir2, "a");
$string = "Numero de serie de la unidad: ".$nserie.;
$write = fputs($fp, $string);
fclose($fp); 
}
else
{
echo "Error";
}
?>

WHK

dame un segundo y arreglo el código

WHK

Ya está:
http://127.0.0.1/tarea1.php?archivo=test.php&pass=123456

Código (php) [Seleccionar]
<p>
-Que recoja una variable mediante $_GET["archivo"].
-Que recoja otra variable mediante $_GET["pass"].
-Que para continuar leyendo código se necesite una contraseña (123456).
-Que cree un archivo llamado $archivo0 y que, en caso de que exista, se llame $archivo1, $archivo2 ... y así sucesivamente (de forma que no se repita ningún archivo).
-Que dentro del archivo se escriba $archivo.
</p>

<?php
$basepath dirname(__file__);
if(isset($_GET['archivo']) and isset($_GET['pass'])){
/* Previene Disclosure y crackeo de colisiones */
if(md5(sha1($_GET['pass'])) == 'd93a5def7511da3d0f2d171d9c344e91'){
/* prevee LFI y carácteres inválidos. */
if($file preg_replace('|[^A-Za-z0-9_\.]|i'''basename($_GET['archivo']).PHP_EOL)){
if(file_exists($file)){
/* Separa el nombre de la extensión */
if($extension explode('.'$file)){
$extension $extension[count($extension) - 1];
$full_filename substr($file0, (strlen($file) - strlen($extension) - 1));
}else{
$extension '';
$full_filename $file;
}
/* Ya existe un archivo renombrado con la misma extensión */
if($change glob($full_filename.'_*.'.$extension)){
/* Obtiene el último archivo incrementado */
sort($change);

$full_filename $change[count($change) - 1];
/* Elimina la extensión */
$full_filename substr($full_filename0, (strlen($full_filename) - strlen($extension) - 1));
/* Obtiene el número incrementado */
$number explode('_'$full_filename);
$number $number[count($number) - 1];
/* Cambia el nombre del archivo */
$full_filename substr($full_filename0, (strlen($full_filename) - strlen($number)));
$full_filename .= (int)$number 1/* Incementa un valor */

file_put_contents($basepath.'/'.$full_filename.'.'.$extension$full_filename.'.'.$extension);

}else{ /* No existe el archivo renombrado, lo creará... */
/* Crea el primer autoincrementado */
file_put_contents($basepath.'/'.$full_filename.'_0.'.$extension$full_filename.'_0.'.$extension);
}
}else{
file_put_contents($basepath.'/'.$file$file);
}
}else{
echo '<p>Debe ingresar un nombre de archivo.</p>';
}
}else{
echo '<p>Contraseña inválida.</p>';
}
}
?>


<form method="get" action="?">
<input type="text" name="archivo" /> Nombre del archivo<br />
<input type="password" name="pass" /> Contraseña<br />
<input type="submit" />
</form>


Si ya existe un archivo le cambia solamente el número manteniendo la extensión y evitando lfi para que no pongan de nombre un "../../../../autoexec.bat".
También corregí el nombre del archivo y le agregué un hash en ves de pasar el password en texto plano porque si te hackean te revelan la contraseña, en cambio de esta forma no podrán obtener tu contraseña porque le hize doble codificación para evitar crackeos y colisiones.

De todas formas no me gustó el diseño del código, para mi eso es un mal diseño porque hubiera sudo mas fácil y mas corto poner un
archivo_md5(microtime())_.extension
y con eso no hubieras necesitado obtener numeros ni autoincrementar ni nada. de hecho así lo hace facebook, imageshack, etc.

Además el hacerlo via GET sin tokens es una muy mala practica ya que este código tiene xsrf por causa de su diseño ya que un ataque csrf via get es mucho mas facil de ejecutar que uno via post, por ejemplo:
<img src="http://127.0.0.1/tarea1.php?archivo=test.php&pass=123456" />
Cosa que no pasaría su estubiera via get.

En fin, yo me hubiera ahorrado mucho código y hacerlo mucho mas seguro si el diseño hubiera sido diferente.

Saludos.

antoz

muchas gracias, es incluso mejor de lo que esperaba  :D