Hola amigos, no supe bien donde colocar éste tema si en PHP o JS ya que, nose qué metodo podría venir mejor para conseguir lo que en el título se refiere.

De todas formas muevanlo donde sea correcto y disculpen.


Os pego el code que tengo documentado para que veais lo que quiero hacer:



-- Script JS (mirar después del script PHP, please)

Código: Seleccionar todo

<SCRIPT type="text/javascript" LANGUAGE="javascript">

function confirmacion(archivoEliminar) {
    if (confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.'))  
    {
		alert(archivoEliminar);
		var archivo;
		var archivo = new ActiveXObject("Scripting.FileSystemObject");
		eliminar = new File(archivoEliminar);
		eliminar.remove();
		
		
		if (archivo.remove())
		{
			alert('El fichero ha sido borrado satisfactoriamente');
		} else {
			alert('El fichero no puede ser borrado');
		}
	} else {
	alert('no se ha aceptado');
	}
}
</SCRIPT>

-- Script PHP

Código: Seleccionar todo

$archivoURL = count(explode("-split-", $extraccionURL))-1;

/* Aquí creamos un contador de archivos que extraemos todos ellos (con ruta completa) de la variable $extraccionURL y los separamos mediante el split*/



for ($i = 0; $i < $archivoURL; $i++){

/* con el indice $i, podemos obtener la propiedad que desemos de cada archivo único y trabajar con él */


$archivoSeparado = explode("-split-",$extraccionURL);

/* Aquí asignamos a $archivoSeparado cada uno de los archivos (con ruta completa) extraidos de la variable $extraccionURL */


$archivoEliminar = $archivoSeparado[$i]; 

/* Gracias al recorrido de la variable $i, podemos asignar cada elemento a la variable $archivoEliminar para trabajar con ella refiriendonos a éstos archivos */


if (!empty($archivoEliminar)) {
	
/* Aquí vamos a verificar que $archivoEliminar existe y además tiene valor, en caso de ser cierto procederemos a crear un botón por cada archivo */


echo "Desea eliminar el archivo $archivoEliminar";

echo '<input type="button" onclick="javascript:confirmacion(\''.$archivoEliminar.'\');" value="Eliminar"><br /><br />';

/* éste boton es el encargado de llamar al evento de confirmacion(); cuando es pulsado (onclick) y enviarle la ruta del archivo a eliminar almacenada en $archivoEliminar. */
	}
}


En caso de querer eliminar el archivo mediante JS, he probado como está arriba, también con la función "Delete();" o bien "DeleteFile();" entre otros, pero los archivos ni se inmutan.

Viendo que los archivos siguen ahí, he pensado en que, de alguna forma el script JS devuelva a PHP un valor que indique que el usuario ha aceptado y así probar mediante la funcion en php "unlink();"


Nose que fayo puedo tener pero me está causando problemas.


Espero que puedan ayudarme y si conseguimos arreglarlo, que al menos le sirva a alguien de ayuda.


Gracias y Salu2
Daria todo lo que sé por la mitad de lo que ignoro
Puedes usar ajax pero es mas lío para algo que es tan sencillo como esto mejor haz un window.location y manda datos por GET y borras con unlink

lo del activex es para borrar archivos de tu rigido xD no del server :P
weno te dejo un codigo mediocre que hize para demostrarte lo que te planteo.

Código: Seleccionar todo

<script>
function confirmar()
{
  if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.'))  
  {
    window.location="?dato=borrar";
  }
}
</script>

<?php
if(!isset($_GET['dato']))
{
  echo '<input type="button" onClick="confirmar()" value="borrar">';
}
else
{
  unlink("borrar.tx");
  echo "archivo borrado";
}
?>

//mHmm..
jj como siempre.... linkgl dandome ideas

Viendo tu planteamiento me entran ganas de alterar todo el fuente que puse, pero me entra una duda y creo que es obvia...

Me parece un poco inseguro que $_GET quede así:

Código: Seleccionar todo

?dato=C:/xampp/htdocs/Subir Archivos/ARCHIVOS/archivo.txt
¿no crees?


Ahora mismo en Pruebas, estoy integrando todas las funcionabilidades dentro del mismo script.php, por lo que no haría falta tener que subir variables al GET.... bastante tengo con todas las que wordpress carga inutilmente (hablo de wordpress ya que cuando termine este control lo tendré que integrar en un plugin, pero bueno no es problema por ahora) xD

Viendo el tema se me ocurre dejar JS unicamente para la confirmación y en su defecto (o si no me quedara otra), pasarle una variable a la página de tipo '1' o '2' para cada archivo, (bfffff ) sin irnos de la página para recargar únicamente el listado de archivos que no se han borrado.

Creo que sería algo complicado de depurar más que de programar jaja de todas formas soy todo oidos... veremos qué puedo hacer mientras se os ocurre otra forma de hacer esto.


Por ahora gracias y ya os contaré resultados mientra espero otros vuestros :P. Thank's
Daria todo lo que sé por la mitad de lo que ignoro
pues pasa los datos por post con ajax, enseguida veo si me puedo hacer un espacio y hago un ejemplo.

--Edito

Ejemplo mediocre pero rápido que te hize con POST usando ajax

Código: Seleccionar todo

<script>
var conexion;
function confirmar()
{
  if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.'))  
  {
    conexion=HttpRequest();
    conexion.onreadystatechange = dibujar;
    conexion.open('POST','?', true);
    conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    conexion.send('dato=archivo_a_borrar.txt');  

  }
}
function dibujar()
{
  if(conexion.readyState == 4)
    document.getElementById("proceso").innerHTML = 'Archivo eliminado';
  else 
    document.getElementById("proceso").innerHTML = 'Eliminando';
}

//Funcion que evita problemas con navegadores y crea la peticion ajax
//Idea original de la funcion extraida de ajaxya.com.ar
function HttpRequest() 
{
  var xmlHttp=null;
  if (window.ActiveXObject) 
  {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else
  { 
    if (window.XMLHttpRequest)
    { 
      xmlHttp = new XMLHttpRequest();
    }
  }
  return xmlHttp;
}

</script>
<div id="proceso"></div>
<?php
if(!isset($_POST['dato']))
{
  echo '<input type="button" onClick="confirmar()" value="borrar">';
}
else
{
  unlink($_POST['dato']);
  echo "archivo borrado";
}
?>
//mHmm..
Sinceramente y perdón por el término... "Acojonante.." jeje

Al menos he de reconocer que la función dibujar() y httprequest() me serviran para otras veces :D


Veamos, he intentado aplicar tu code al mio, más bien lo he copiado y modificado algunas cosillas. Lo pego aquí:

Código: Seleccionar todo

<SCRIPT>
var conexion;
function confirmar()
{
  if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.')) 
  {
    conexion=HttpRequest();
    conexion.onreadystatechange = dibujar;
    conexion.open('POST','?', true);
    conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    conexion.send('dato=elimina'); 

  }
}



// Aqui van los 2 "function()" que tu me pegaste en tu respuesta y he nombrado más arriba.



</SCRIPT>

<?php


echo ("<b> Archivos listos para eliminar por completo del servidor </b> ");
echo("<br /><br />");


$urlArchivos = count(explode("-split-", $urlCompleta))-1;

for ($i = 0; $i < $urlArchivos; $i++) {
/* con el indice $i, podemos obtener la propiedad que deseemos de cada archivo único y trabajar con él */


$urlArchivo = $urlArchivos[$i]; /* Aquí agrego cada archivo a una variable única para manejarla mejor luego en las condiciones if */

$_POST['dato'] = $urlArchivo; /* Pasamos la variable a " ?dato=url "


/* Empieza la condición.... está mal de canteo jajaja */

if (!empty($_POST['dato'])) {
  echo '<div id="proceso"></div>';
  echo '<a href="javascript:confirmar();"><img width="16" height="16" border ="0" src="cerrar.jpg"></a>';
}

if ($_POST['dato'] == 'elimina') {
  unlink($urlArchivo);
  echo "archivo borrado";
} }

Bueno como puedes ver, lo único que intentaría (ya que lo que he puesto no funciona.. ) es que; la única variable que pasaría por POST sería desde <script> a php y sería el parámetro " ?dato=elimina " de la URL

así PHP se encargaría de comprobar que cuando $_POST['dato'] sea igual a 'elimina' , procedería a eliminar el archivo correspondiente ya seteado en el FOR.


Lo importante es que se mantenga el FOR ya que sin él no puedo extraer un array de cada archivo concatenado a la variable $archivosURL, y eliminar cada uno de ellos por separado.


Bueno por ahora seguiré "espurgando" tu código haber que saco de él :D, por ahora me gusta... me gusta bastante la idea :D


Gracias linkgl de verdad te lo curras
Daria todo lo que sé por la mitad de lo que ignoro
xD que bueno que te haya gustado, bueno y porque no pasas el nombre por post dato=nombre_del_archivo? Porque para eliminarlo vas a necesitar tener alguna referencia del archivo es decir vas a necesitar el nombre para eliminarlo con unlink es el parámetro que tendrías que pasar de js a php el ?dato=nombre jeje o como vez tú?
//mHmm..
Entiendo lo que me dices linkgl, lo que no sabría es interpretarlo de tal forma que cuando pulse el botón de eliminar y pase la ruta completa "?dato=ruta_completa_del_archivo.extension".... PHP esté atento para verificar que se le ha pasado la ruta.


Así a la ligera se me ocurre algo así:

JS:

Código: Seleccionar todo

var conexion;
function confirmar(archivoEliminar)
{
  if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.')) 
  {
    conexion=HttpRequest();
    conexion.onreadystatechange = dibujar;
    conexion.open('POST','?', true);
    conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    conexion.send("dato="+archivoEliminar); 

  }
}

PHP

Código: Seleccionar todo

if (!empty($_POST['dato'])) {
  echo '<div id="proceso"></div>';
  echo '<a href="javascript:confirmar();"></a>&#32;'.$archivoMostrar.'<br /><br />';
}

if ($_POST['dato'] == $archivoEliminar) {
  unlink($_POST['dato']);
  echo "archivo borrado";
} 

Pero directamente elimina los archivos.... Le echaré un vistazo mas despacio esta noche haber qué consigo ya que ahora no me encuentro en casa... mientras tanto seguiré viendo las ayudas que me aconsejeis y poniendo por aquí si he conseguido algún resultado.


Gracias nuevamente linkgl y Salu2
Daria todo lo que sé por la mitad de lo que ignoro
Actualizo lo que llevo por si a alguien le sirve de ayuda o se estira una ayuda...


Código: Seleccionar todo

$archivoURL = count(explode("-split-", $extraccionURL))-1; /* Aquí creamos un contador de archivos que extraemos todos ellos (con ruta completa) de la variable $extraccionURL y los separamos mediante el split*/


for ($i = 0; $i < $archivoURL; $i++) {
/* con el indice $i, podemos obtener la propiedad que desemos de cada archivo único y trabajar con él */

$urlSeparado = explode("-split-",$extraccionURL); /* Aquí asignamos a $urlSeparado cada uno de los archivos (con ruta completa) extraidos de la variable $extraccionURL */
$archivoSeparado = explode("<br>",$archivos); /* Aquí asignamos a $archivoSeparado en enlace <a href  de cada uno de los archivos extraidos de la variable $archivos */
$archivoMostrar = $archivoSeparado[$i];
$archivoEliminar = $urlSeparado[$i]; /* Gracias al recorrido de la variable $i, podemos asignar cada elemento a la variable $archivoEliminar para trabajar con ella refiriendonos a éstos archivos */


if ($_POST['dato'] == $archivoEliminar) { unlink($_POST['dato']); }
	echo '<div id="proceso"></div>';
	echo "<input type=\"image\" width=\"16\" height=\"16\" border =\"0\" src=\"cross.png\" onClick=\"
	var conexion;
	confirmar();
	
function confirmar() {
  if(confirm('¿Realmente desea eliminar el archivo por completo? \\n\\n NOTA :: El archivo dejará de existir para siempre.')) 
  {
    conexion=HttpRequest();
    conexion.onreadystatechange = dibujar;
    conexion.open('POST','?', true);
    conexion.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    conexion.send=('dato=$archivoEliminar');

  } else {
	conexion='';
	conexion.send('dato='); 
  }
}
function dibujar()
{
  if(conexion.readyState == 4)
    document.getElementById('proceso').innerHTML = 'Archivo eliminado';
  else
    document.getElementById('proceso').innerHTML = 'Eliminando';
}

//Funcion que evita problemas con navegadores y crea la peticion ajax
//Idea original de la funcion extraida de ajaxya.com.ar
function HttpRequest()
{
  var xmlHttp=null;
  if (window.ActiveXObject)
  {
    xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
  }
  else
  {
    if (window.XMLHttpRequest)
    {
      xmlHttp = new XMLHttpRequest();
    }
  }
  return xmlHttp;
}  
\">&#32;$archivoMostrar<br /><br /><br />";
}
Daria todo lo que sé por la mitad de lo que ignoro
php y js son diferentes tienes que declararlos por aparte, la parte de javascript debe ir entre <head> y </head>...

Vamos... lo único que tienes que hacer es poner la funcion que te hize ahí arriba y en tu bucle en php simplemente poner OnClick="confirmar('.$nombre_del_archivo.');"... vamos no se explicarme bien te dejo masomenos como quedaría sin probar en localhost:

Código: Seleccionar todo

<script>
var conexion;
function confirmar(archivo)
{
  if(confirm('¿Realmente desea eliminar el archivo por completo? \n\n NOTA :: El archivo dejará de existir para siempre.'))  
  {
    conexion=HttpRequest();
    conexion.onreadystatechange = dibujar;
    conexion.open('POST','?', true);
    conexion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    conexion.send('dato='+archivo);  

  }
}
function dibujar()
{
  if(conexion.readyState == 4)
    document.getElementById("proceso").innerHTML = 'Archivo eliminado';
  else 
    document.getElementById("proceso").innerHTML = 'Eliminando';
}

//Funcion que evita problemas con navegadores y crea la peticion ajax
//Idea original de la funcion extraida de ajaxya.com.ar
function HttpRequest() 
{
  var xmlHttp=null;
  if (window.ActiveXObject) 
  {
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else
  { 
    if (window.XMLHttpRequest)
    { 
      xmlHttp = new XMLHttpRequest();
    }
  }
  return xmlHttp;
}

</script>
<div id="proceso"></div>
<?php
if(!isset($_POST['dato']))
{
  // aquiiiii va tu bucle php que muestra los archivos con su id o nombre
  $archivoURL = count(explode("-split-", $extraccionURL))-1; /* Aquí creamos un contador de archivos que extraemos todos ellos (con ruta completa) de la variable $extraccionURL y los separamos mediante el split*/


for ($i = 0; $i < $archivoURL; $i++) {
/* con el indice $i, podemos obtener la propiedad que desemos de cada archivo único y trabajar con él */

$urlSeparado = explode("-split-",$extraccionURL); /* Aquí asignamos a $urlSeparado cada uno de los archivos (con ruta completa) extraidos de la variable $extraccionURL */
$archivoSeparado = explode("<br>",$archivos); /* Aquí asignamos a $archivoSeparado en enlace <a href  de cada uno de los archivos extraidos de la variable $archivos */
$archivoMostrar = $archivoSeparado[$i];
$archivoEliminar = $urlSeparado[$i]; /* Gracias al recorrido de la variable $i, podemos asignar cada elemento a la variable $archivoEliminar para trabajar con ella refiriendonos a éstos archivos */

echo '<a href="#" onClick="confirmar('.$urlSeparado.')">borrar: '.$urlSeparado.'</a>';

}
else
{
  unlink($_POST['dato']);
  echo "archivo borrado";
}
?>
Sería como eso el bucle lo pones en el if(!isset... vamos interpretando el código diriamos

Si no esta seteada la variable dato hacemos el bucle para leer y mostrar los archivos cada uno con un enlace que mande a javascript su nombre entonces al dar click en alguno la funcion confirmar(archivo) toma como archivo el nombre, entonces hace el proceso y lo elimina! recuerda que aquí:


echo '<a href="#" onClick="confirmar('.$urlSeparado.')">borrar: '.$urlSeparado.'</a>';

urlSeparado debe ser la ruta del archivo a eliminar! si no me explique ni papa me dices e intento explicarlo de nuevo
//mHmm..
Claro que te entendí amigo!!

De hecho terminé hace poco de arreglar el código por completo y estaba pensando en subirlo al site pero me eché para atrás al ver que no me duró ni 2 minutos al intentar juackearlo con HTTP Live Header, subiendo por ejemplo una shell en formato .JPG mientras capturaba con el HTTP Live Header, luego modificaba la extensión en éste plugin, de .jpg a .php y.... bualá!! shell inyectada en el el directorio y funcionando sin problemas.


Me gustaría tapar éstos agujeros de seguridad ya que le hice un filtro de whitelist pero igualmente con HTTP Live Header se traga el archivo que quiera.

¿Posteo en un tema aparte para limpiar el tema o lo pongo por aquí?

Bueno ya me contarán y así haré ya que no me interesa para nada que los usuarios puedan acceder al directorio y mucho menos ponerse a descargar archivos o a subir shells o cualquier tipo de xploit que me robe las BBDD's o lo que sea... bueno me espero a vuestra respuesta.


Gracias por tu colaboración linkgl :D

PD: saben porque ultimamente el sitio está OFF?? Yo también tengo problemas con OVH sino que los servicios que yo tengo contratados siguen sin funcionar.... bueno ahí lo dejo. Salu2
Daria todo lo que sé por la mitad de lo que ignoro
Lo mejor sería que abrieras otro tema, pero lo primero que se me ocurre esque cambies la extención de los archivos que se suben y prohibas ver el directorio donde se alojan mediante la htaccess, es decir si yo subo imagen.jpg la cambias por imagen#jpg y en la htaccess prohibes el acceso al directorio y pones todos los archivos como descarga por si se logran burlar la seguridad en algun caso algun super hacker como el master arturo pues asi ya no se ejecuta el script se manda directo a descarga.
//mHmm..
Me parece buena tu idea aunque algo complicada mirandola desde el punto de vista de que estoy incrustando éste control en un plugin de mensajería interna de wordpress... por lo que debería crear una regla para ver con qué extensión entró el archivo, con cual se ha quedado y con cual ha de reproducirse, ya que igual que entran los archivos luego se mostraran con un target_blank o permitirán descargarlos, eliminarlos incluso moverlos.... algo complicado así a primeras por lo que me centraré en crear un filtro para evitar el salteo y luego ya le daré funcionabilidad... voy a currarme en estos dias un POST con el archivo zippeado para que lo puedan descargar y usar por completo y también añadiré un manual para saltearse la protección para que ustedes también lo vean y así esperaré si alguien quiere aportarse un código para evitar ese tipo de Hack.

Bueno por todo lo demás... ¿Donde pongo el nuevo tema? ¿Aquí en dudas de desarrollo y programación? muchísimas gracias y Salu2.
Daria todo lo que sé por la mitad de lo que ignoro
Como tal puso linkj :


PHP:

Código: Seleccionar todo


<form method="post" action="<?php echo $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];?>">
archivo: <input name="archivo" type="text">
<input value="Borrar" type="submit">
</form>

<?php

$pagina = $_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];

if(isset($_POST["archivo"]))
{
unlink("directorio");
}else
{
header("Location: $pagina");
}

?>
Responder

Volver a “PHP”