php - remove - unlink permission denied windows
PHP-rmdir(permiso denegado) (4)
Tengo un script fácil de crear y eliminar una carpeta, pero cuando intento eliminar una carpeta, aparece y aparece un error.
El código:
<?php
if ($_POST[''hidden'']) {
$key = "../g_test/uploads";
$new_folder = $_POST[''nazevS''];
$new_dir_path = $key."/".$new_folder;
$dir = mkdir($new_dir_path);
if($dir)
chmod ($new_dir_path, 0777);
}
if ($_POST[''hiddenSS'']) {
$key = "../g_test/uploads";
$new_folder = $_POST[''nazevS''];
rmdir($key."/".$new_folder);
}
?>
El mensaje de error:
Warning: rmdir(../g_test/uploads/) [function.rmdir]: Permission denied in /home/free/howto.cz/m/mousemys/root/www/g_test/upload.php on line 51
¿Alguien sabe cómo eliminar la carpeta (con suerte con todo lo que hay dentro)? Además, si ves alguna otra mejora, el código podría, siéntase libre de decirme. :-)
Gracias, Mike.
A los fines de esta respuesta, pondré los riesgos de seguridad de permitir que todas y cada una de las cargas en un directorio sean dejadas de lado. Sé que no es seguro, pero creo que este problema está fuera del alcance de la pregunta original .
Como todos dijeron, puede ser un problema de permiso. Pero desde que creó el directorio en su código (que probablemente se ejecuta como el mismo usuario cuando se elimina). Dudo que sea eso.
Para eliminar un directorio, debe asegurarse de que:
Usted tiene los permisos adecuados (como todos señalaron).
Todos los identificadores de directorio deben estar cerrados antes de eliminarlos .
(Dejar las manillas abiertas puede causar errores de Permiso denegado )El directorio debe estar vacío .
rmdir()
solo elimina el directorio, no los archivos dentro. Por lo tanto, no puede hacer su trabajo si todavía hay cosas adentro.
Para arreglar el número 2, es extremadamente simple. Si está usando algo como esto:
$hd = opendir($mydir);
Cierre su controlador antes de eliminarlo:
closedir($hd);
Para el número 3, lo que quiere hacer se llama eliminación recursiva. Puede usar la siguiente función para lograr esto:
function force_rmdir($path) {
if (!file_exists($path)) return false;
if (is_file($path) || is_link($path)) {
return unlink($path);
}
if (is_dir($path)) {
$path = rtrim($path, DIR_SEPARATOR) . DIR_SEPARATOR;
$result = true;
$dir = new DirectoryIterator($path);
foreach ($dir as $file) {
if (!$file->isDot()) {
$result &= force_rmdir($path . $file->getFilename(), false, $sizeErased);
}
}
$result &= rmdir($path);
return $result;
}
}
El servidor web requiere acceso de escritura a la carpeta que está intentando eliminar. Puedes proporcionar esto con:
chgrp -R www-data g_test/uploads
chmod g+w g_test/uploads
donde www-data es el usuario con el que se ejecuta el servidor web (puede ser apache o alguna variación según el sistema operativo y la instalación del servidor). Después de esto, puede ejecutar rmdir
(o rm -r
si el directorio no está vacío).
Además, tenga en cuenta que dar al servidor web la posibilidad de escribir en un directorio posee problemas de seguridad . En determinadas situaciones, esto podría permitir que un usuario malintencionado ejecute código arbitrario (es decir, se haga cargo de su máquina) o modifique su sitio web (es decir, el software espía del servidor).
Por estos motivos, solo debe darles a los dir la perms de escritura que:
- absolutamente los necesito
- no contiene el código fuente
- están fuera del directorio que contiene scripts
- propiedad del servidor
En esta configuración en una máquina de producción, puede configurar un directorio separado solo para este tipo de archivo, que solo Apache puede escribir. Si tiene que implementar archivos en este directorio, use sudo
o la cuenta raíz para limitar las cuentas que tienen acceso.
Para una descripción más completa de lo que quiero decir, eche un vistazo a la sección de consejos de seguridad en la documentación de Apache.
Generalmente, los scripts PHP en Unix / Linux se ejecutan como usuario "nobody", lo que significa que necesitan los privilegios "all", por lo que se trata de un problema de permisos con el directorio. Además, para eliminar un archivo o directorio en Linux / Unix necesita privilegios de escritura en el directorio principal . Ese podría ser tu problema.
Si tiene problemas con los archivos o directorios que crea, use chmod()
en ellos para establecer los permisos correctos.
También podría no estar vacío.
Además, vale la pena mencionar que
$new_folder = $_POST[''nazevS''];
$new_dir_path = $key."/".$new_folder;
es realmente malo desde el punto de vista de la seguridad. Desinfecte esa entrada.
Parece que necesita derechos de acceso en la carpeta que intenta editar.
Para cambiar esto:
chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/
o tal vez deberás hacer
sudo chmod ug+rw /home/free/howto.cz/m/mousemys/root/www/g_test/
Asegúrese de que esto es lo que desea hacer y de que su aplicación es segura. No otorgue derechos de escritura a ninguna aplicación, ya que podría ocasionar problemas de seguridad.