usuarios - sistema de login php mysql completo
¿Cómo comprobar cómo se ejecuta el usuario php? (12)
Necesito detectar si php se ejecuta como nadie. ¿Cómo hago esto?
¿Hay otros nombres para "nadie"? "apache"? ¿Cualquier otro?
Propuesta
Un poco tarde, pero a pesar de que lo que sigue es una solución alternativa, resuelve el requisito ya que funciona bien:
<?
function get_sys_usr()
{
$unique_name = uniqid(); // not-so-unique id
$native_path = "./temp/$unique_name.php";
$public_path = "http://example.com/temp/$unique_name.php";
$php_content = "<? echo get_current_user(); ?>";
$process_usr = "apache"; // fall-back
if (is_readable("./temp") && is_writable("./temp"))
{
file_put_contents($native_path,$php_content);
$process_usr = trim(file_get_contents($public_path));
unlink($native_path);
}
return $process_usr;
}
echo get_sys_usr(); // www-data
?>
Descripción
El resaltado de código anterior no es preciso, copie y pegue en su editor favorito y visualícelo como código PHP, o guárdelo y pruébelo usted mismo.
Como probablemente sepa, get_current_user()
devuelve el propietario del "script actual en ejecución", por lo que si no "chown" un script en el servidor para el usuario del servidor web, lo más probable es que sea "nobody", o si el desarrollador-usuario existe en el mismo sistema operativo, más bien mostrará ese nombre de usuario.
Para solucionar esto, creamos un archivo con el proceso actual en ejecución. Si solo require()
esto en el script en ejecución actual, devolverá lo mismo que el script padre como se mencionó; entonces, debemos ejecutarlo como una solicitud separada para que tenga efecto.
Flujo del proceso
Para que esto sea efectivo, considere ejecutar un patrón de diseño que incorpore "modo de tiempo de ejecución", de modo que cuando el servidor esté en "modo de desarrollo o modo de prueba", solo podría ejecutar esta función y guardar su salida en algún lugar de un , o simplemente texto o base de datos, o cualquiera que sea.
Por supuesto, puede cambiar algunos detalles del código anterior para hacerlo más dinámico, pero la lógica es la siguiente:
- definir una referencia única para limitar la interferencia con otros usuarios
- definir una ruta de archivo local para escribir un archivo temporal
- definir una url pública / ruta para ejecutar este archivo en su propio proceso
- escriba el archivo php temporal que genera el nombre del propietario del script
- obtener el resultado de este script haciendo una solicitud al mismo
- elimine el archivo porque ya no lo necesita, o déjelo si lo desea
- devolver el resultado de la solicitud como valor de retorno de la función
En mi configuración, quiero verificar si el proceso actual tiene permiso para crear carpetas, subcarpetas y archivos antes de comenzar un proceso y sugerir una solución si parece que no puedo. Quería ejecutar stat(<file>)
en varias cosas para asegurar que los permisos coinciden con los del proceso en ejecución (estoy usando php-fpm, por lo que varía según el grupo).
La solución basada en posix que Mario dio más arriba, parece perfecta; sin embargo, parece que la extensión posix está desactivada, así que no pude hacer lo anterior y como quiero comparar los resultados con la respuesta ejecutando stat () ejecutando whoami
en un whoami
separado shell tampoco es útil (necesito el uid y el gid, no el nombre de usuario).
Sin embargo, encontré una pista útil, podría stat(/proc/self)
y stat(/proc/self/attr)
y ver el uid y el gid del archivo.
Espero que ayude a alguien más
Más detalles serían útiles, pero asumiendo que es un sistema Linux, y asumiendo que php se está ejecutando bajo Apache, se ejecutará como siempre que el usuario apache se ejecute.
Una manera fácil de verificar (una vez más, asumiendo algún entorno unix) es crear un archivo php con:
<?php
print shell_exec( ''whoami'' );
?>
que te dará el usuario.
Para mi instancia de AWS, obtengo apache
como salida cuando ejecuto este script.
Puedes intentar usar palos de fondo como este:
echo `whoami`;
Tipo de camino hacia atrás, pero sin exec / sistema:
file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");
Si crea un archivo, el propietario será el usuario de PHP.
Esto también podría ejecutarse con cualquiera de las funciones de archivos temporales como tempnam()
, que crea un archivo aleatorio en el directorio temporal y devuelve el nombre de ese archivo. Si hay problemas debido a algo así como los permisos, open_basedir
o modo seguro que impiden escribir un archivo, normalmente, el directorio temporal seguirá permitido.
Usualmente uso
<?php echo get_current_user(); ?>
Estaré contento si te ayudó
agregue el archivo info.php al siguiente directorio - su directorio http / apache predeterminado - normalmente / var / www / html
con los siguientes contenidos
<?php
phpinfo();
?>
Luego, httpd / apache reinicia el ir a tu directorio html predeterminado http://enter.server.here/info.php
¡entregaría todo el pedigrí php!
yo usaría:
lsof -i
lsof -i | less
lsof -i | grep :http
cualquiera de estos. Puede escribir em en su línea de comandos ssh y verá qué usuario está escuchando qué servicio.
También puedes ir y verificar este archivo:
more /etc/apache2/envvars
y busca estas líneas:
export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name
para filtrar los datos del archivo envvars, puede usar grep:
more /etc/apache2/envvars |grep APACHE_RUN_
exec(''whoami'')
hará esto
<?php
exec(''whoami'');
?>
<?php echo exec(''whoami''); ?>
Si está disponible, puede sondear la cuenta de usuario actual con posix_geteuid
y luego obtener el nombre de usuario con posix_getpwuid
.
$username = posix_getpwuid(posix_geteuid())[''name''];
Sin embargo, si está ejecutando en modo seguro (que a menudo es el caso cuando el ejecutor está deshabilitado), entonces es poco probable que su proceso de PHP se ejecute en otra cosa que no sea la cuenta predeterminada de www-data
o apache
.
$_SERVER["USER"]
$_SERVER["USERNAME"]