Tienda | Foros | Blogs | EN |
 

apache y php mas script de seguridad

Seguir
Aki estoy otra vez ^^U
Tuve unos problemillas con el mysql despues, pero era una tonteria ke consegui solucionar mirando los archivos /usr/local/mysql/var, y es ke cdo volvi a instalar por enesima vez el mysql, como lo tenia lanzado de antes, no me dejaba volver a lanzarlo (cosa logica) xD

Bueno, pero ahora vengo con una cosa nueva. Apache+PHP
Lo he instalado varias veces, y todas ellas me iba, pero sin embargo no me dejaba usar el script ke rula por inet de la autentificacion, para ponerle algo de seguridad, aunke sea una chorrada. Estuve indagando y encontre una pagina en la ke decian ke se necesitaba tener el php instalado como modulo de apache para ke funcionase, ke como cgi no funciona, y en la primera instalacion lo tenia como cgi. Asi ke me puse a buscar a ver como instalarlo como modulo y encontre un minimanual en el ke algo te explicaba, lo hice tal cual, y sigue sin funcionar. Aunke no es eso lo ke mas me molesta, sino ke tenia ya una pagina hecha con formularios y acceso a mysql, la cual no funciona Triste En si la pagina simplemente son los formularios y unas sentencias condicionales dentro del codigo para php. Asi kedaria ke la primera vez ke entras en la pagina te sale el formulario, pero si pulsas el boton de buskeda, dentro de la misma pagina hay una sentencia condicional ke te mostrara los resultados ke coincidan con esa buskeda.

if ($buscar)
echo "x";
else
echo "formularios";

Debo decir ke el codigo esta bien, seguro, pues lo probe en su dia y funcionaba. O sea se, ke el problema esta en la instalacion de apache+php.

Lo de ke no vaya bien lo se pq le puse unos filtros para ke si ponias letras en lugar de numeros en la fecha (por ejemplo), te mostraba un error estilo "Fecha erronea", con un link de la misma pagina para volver al formulario. Y eso deberia funcionar, pues la pagina en si aparece, pero solo el formulario.

Creo ke la estoy liando demasiado XDDD

Bueno a ver, te pongo aki los configure ke hice en dos ocasiones.

La primera como cgi :

./configure --prefix=/usr/local/apache/1.3.27 --datadir=/web/htdocs --enable-rule=SHARED_CORE --enable-module=so

La segunda con modulos:

./configure --prefix=/usr/local/apache --activate-module=src/modules/php4/libphp4.a --activate-module=src/modules/standard/mod_speling.o --activate-module=src/modules/standard/mod_info.o

(en el php con esta segunda puse: ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-apache=/usr/src/install-apache/apache_1.3.XX \
--enable-track-vars --enable-force-cgi-redirect --with-gettext)

Por lo del directorio de apache no hagas caso, ke es ke lo he copiado de los manuales ke hay por inet.

Y eso, ke no me termina de instalar bien el php y ya toy cansado de mirar cosas Triste Mire tb en la pagina oficial, pero no encontre nada sobre lo de instalar php como modulo ke me aclarase el problema.

Muchas gracias otra vez por tu tiempo y un saludo Feliz


12 Soluciones propuestas

Hola, exactamente, ¿El error lo tienes al compilar PHP? Mejor pasa los mensajes de error que estás recibiendo en la compilacion.

No trates de probarlo con scripts sofisticados. Simplemente haz un script php muy simple con un echo "Hola mundo!", por ejemplo. O con un echo php_info();

Pasa los errores de compilación. Puedes hacer un archivo con los errores de complilacion así: make 2>errores.log

Ahí rediriges los errores a un archivo errores.log, luego nos copias en el foro el contenido de errores.log.

Saludos y suerte.
No no, si la compilacion no da errores, el problema es ke una vez esta instalado no consigo ke vayan bien las cosas. No se exactamente ke diferencia hay entre instalar el php como modulo de apache a como cgi, lo unico ke lei por ahi ke si es como cgi el script de seguridad no funcionaria, pera, te pongo aki el codigo de eso, ke es cortito:

# if (!isset($PHP_AUTH_USER))
# {
# header('WWW-Authenticate: Basic realm="La web de prueba"');
# header('HTTP/1.0 401 Unauthorized');
# echo 'Autorizacion requerida';
# echo '<TABLE><A Href=index.html><H3>Volver</H3></A></TABLE>';
# exit;
# }

# $fich = file("passwords.txt");
# $i=0; $validado=false;
# while ($fich[$i] && !$validado)
# {
# $campo = explode("|",$fich[$i]);
# if (($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1]))) $validado=true;
# $i++;
# }

# if (!$validado)
# {
# header('WWW-Authenticate: Basic realm="La web de prueba"');
# header('HTTP/1.0 401 Unauthorized');
# echo 'Autorizacion requerida.';
# echo '<TABLE><A Href=index.html><H3>Volver</H3></A></TABLE>';
# exit;
# }

(Lo tengo comentado pq sino no me dejaba entrar en la pagina)

De ke la instalacion sea como modulo o como cgi deduzco ke el resto de problemas ke tengo con la pagina han de ser por eso tb, es decir, ke si consigo ke me vaya el script de seguridad seguramente tb me iran las paginas (vamos, como lo tenia todo antes de reinstalar).
Lo otro es ke es mas complicado de explicar, pero digamos ke en una misma pagina (en un mismo php), hay como si fueran varias paginas. Me explico, la primera vez ke se entra, como el valor de las variables es cero, pues se muestra un formulario. Una vez dentro, ke ya se puede pulsar botones, pues depende de cual pulses te lleva a un lado o a otro, pero todo el codigo esta en la misma pagina. Eso lo he hecho con sentencias condicionales dentro del codigo de php (tb se podria hacer con case, ke para el caso tb es una condicion xD). Y ahi es donde me viene la movida. Ahora mismo tal como lo tengo entro en la pagina y solo me carga el formulario, hace caso omiso a las sentencias condicionales. Y eso es lo ke mas me jode.

Espero haberme explicado bien esta vez. Muchas gracias por tu tiempo mauricio. Y un saludo muy grande Feliz
Hola Robin, sobre la diferencia entre correr PHP como CGI o como módulo SAPI (en Apache u otro servidor WEB).

Como CGI php se utiliza como un programa en línea de comandos, y se le pasan las entradas como a cualquer programa de línea de comandos por argumento o por entrada estándar. Se puede por lo tanto hacer chroot y setuid al cgi de php para establecer ambientes de ejecución segura de scripts. La idea es que se utilice de esta forma solo si se sabe que se precisa por una necesidad especial, lee http://www.php.net/manual/es/security.cgi-bin.php. Una seria desventaja de utilizar php como CGI, (además de que las configuraciones de seguridad son un poco más complicadas) es que cada vez que se utiliza PHP se abre un nuevo proceso del cgi de php. Levantar un proceso significa un costo de recursos del sistema para efectuar la tarea.

La forma preferida de correr PHP es como módulo. Cuando se corre como módulo PHP se integra al servidor web como una extensión del mismo, por tanto se inicia una sola vez cuando se levanta el servidor WEB. En este caso PHP corre con los privilegios del usuario de Apache que usualmente es nobody, lo que provee un entorno bastante seguro.

Lo que tú estás haciendo en el script es utilizar la autentificación por HTTP. Esta forma de autentificación está disponible solo en PHP corriendo como módulo de apache y no como CGI. Seguramente porque en la versión CGI no se puede enviar al servidor web, y luego al cliente el mensaje HTTP para requerir autentificación , lo que haces en la línea con la función header().

Lee sobre esto en:
http://us2.php.net/features.http-auth

Mi recomendación, si no tienes una necesidad apremiante para utilizarlo como CGI, un método un poco obsoleto en estos tiempos, no lo hagas, utilízalo como módulo.

Te recomendaría leer documentación adicional sobre HTTP para hacerte una mejor idea de como funciona la autentificación que estás utilizando, tienes los RFCs 2616 y especialmente el 2617.

Saludos y suerte.
Muchas gracias por la informacion sobre la diferencia entre cgi y php, me servira Feliz
La pagina sobre la autentificacion por http ya la lei por encima, antes de poner la cuestion aki, pero no me aclaro nada Triste
De ahi es de donde sake lo de ke para ke funcionase tenia ke hacer la instalacion del php como modulo de apache. Pero el problema es ke lo tengo asi, y sigue sin funcionar, ni eso, ni lo del ejemplo de pagina ke te dije.
Supongo ke no me keda otra opcion ke tirar de apt, para tenerlo como lo tenia antes, pero me molesta el hacerlo con los sources oficiales y no obtener el mismo resultado Triste
Un saludo, y muchas gracias por tu ayuda.
Si me surge alguna duda con cualkier otra cosa ya se donde acudir teeth smile
Hola Robin,

¿Entonces ya lo tienes compilado como módulo? ¿El PHP está andando? ¿Hiciste alguna prueba mínima además de esta de autenticación? Por ejemplo, es muy útil la función phpinfo() porque ya te dá información del estado de php y las características con las que está funcionando.

¿No será que lo compilaste como módulo pero olvidaste hacer la configuración en Apache? Capaz que todavía está usando el CGI. Tienes que cargar el módulo con una línea LoadModule en /etc/apache/httpd.conf.

Vamos que tiene solución.

Saludos.
Compilado como modulo estaba, en la segunda instalacion no lo toke en el httpd.conf del apache, lo hice en la configuracion directamente: --activate-module=src/modules/php4/libphp4.a

En la instalacion de apache como cgi si ke puse en el httpd.conf la linea de LoadModule, pero tp iba asi Triste

A ver si en ultimos intentos se puede solucionar.Un saludo y gracias por aguantar ahi al frente de la brecha Feliz
Robin escribió:
Compilado como modulo estaba, en la segunda instalacion no lo toke en el httpd.conf del apache, lo hice en la configuracion directamente: --activate-module=src/modules/php4/libphp4.a

En la instalacion de apache como cgi si ke puse en el httpd.conf la linea de LoadModule, pero tp iba asi Triste

A ver si en ultimos intentos se puede solucionar.Un saludo y gracias por aguantar ahi al frente de la brecha Feliz


A ver.. por el phpinfo que me pasaste, tienes php corriendo como módulo para Apache 1, eso es bueno, y está funcionando sino no podrías haber visto el phpinfo. Ahora, no te des por vencido, php funciona, lo que no te funciona es el script de autentificación basado en autentificación HTTP. ¿Por qué? Veamos. Voy a probarlo en casa, porque nunca he usado autentificación por HTTP, solo he utilizado autentificación por formulario y sesiones. Perame que te cuento...
Bien, según me pasaste en la salida de tu phpinfo, esta es la configuración de tu php:

'./configure' '--prefix=/usr/local/php' '--with-mysql=/usr/local/mysql' '--with-apache=/usr/local/src/lamp/apache_1.3.29' '--enable-track-vars' '--enable-force-cgi-redirect' '--with-gettext'

y estos los módulos de Apache cargados:

mod_php4, mod_setenvif, mod_auth, mod_access, mod_alias, mod_userdir, mod_speling, mod_actions, mod_imap, mod_asis, mod_cgi, mod_dir, mod_autoindex, mod_include, mod_info, mod_status, mod_negotiation, mod_mime, mod_log_config, mod_env, http_core

mod_auth está cargado así que todo debería funcionar.

Cito el script que mandaste:

[code:1:7418f02df4]
if (!isset($PHP_AUTH_USER)) {
header('WWW-Authenticate: Basic realm="La web de prueba"');
header('HTTP/1.0 401 Unauthorized');
echo 'Autorizacion requerida';
echo '<TABLE><A Href=index.html><H3>Volver</H3></A></TABLE>';
exit;
}

$fich = file("passwords.txt");
$i=0; $validado=false;
while ($fich[$i] && !$validado) {
$campo = explode("|",$fich[$i]);
if (($PHP_AUTH_USER==$campo[0]) && ($PHP_AUTH_PW==chop($campo[1])))
validado=true;
$i++;
}

if (!$validado) {
header('WWW-Authenticate: Basic realm="La web de prueba"');
header('HTTP/1.0 401 Unauthorized');
echo 'Autorizacion requerida.';
echo '<TABLE><A Href=index.html><H3>Volver</H3></A></TABLE>';
exit;
} [/code:1:7418f02df4]

Lo único latente de falla que veo aquí es el uso de $PHP_AUTH_USER y demás en vez de $_SERVER['PHP_AUTH_USER'], si tienes la directiva register_globas de tu php.ini en off, cosa que es así por defecto desde php 4.2 entonces estas variables globales no van a existir, solo van a existir dentro del array $_SERVER y una vez tras otra va a suceder que se ejecuta el primer if y nunca te logras autentificar. Si no es esta la falla, cuenta cual es que creo ya la tenemos acorralada contra el muro!! Entregate bandida!! wink

Saludos y suerte!
Te adoro tio Feliz Aun no he conseguido solucionarlo, pero buscando informacion sobre lo del Register_global he leido ke el no estar activado tb puede perjudicar al Method=Post y eso es lo ke utilizaba para los condicionales, asi ke con mucha suerte si arreglo eso iran las dos cosas. A ver como se tercia la cosa teeth smile
SOLUCIÓN ACEPTADA
Me alegra!!! Mejor es enseñar a pescarpero... acá tenés el pescado: Tenés que utilizar el REQUEST_METHOD del array $_SERVER, sería:

[code:1:84b99adc00]
if ($_SERVER['REQUEST_METHOD'] == "POST") {
[/code:1:84b99adc00]

Espero que esto resultara ser el problema.

Mejor es que no actives el registre_globals y te acostumbres a utilizar las variables globales de sus correspondientes arrays, es más seguro, pues las variables globales, así como las de POST y GET y COOKIES pueden inicializarse por el usuario, a veces con fines maliciosos.

Saludos y suerte.
Por fin he resuelto el problema Feliz Buscando por ahi encontre un caso parecido en el ke aconsejaban ke se metiera la siguiente linea de codigo:

extract ($_POST);

Puesto ke como hay movidas con las variables globales y todo eso, si no se cargaban antes del array post, pues entonces los botones es como si no fueran.

Muchisimas gracias por todo, pq si no me hubieras dicho ke el problema estaba en lo del register_global hubiera tardado muchiiiiisimo en darme cuenta, si es ke alguna vez llegaba a esa conclusion. Ah, y lo del script de seguridad tb funciona ya, era simplemente poner lo ke dijiste Feliz

Pues eso muchacho, muchisimas gracias por tu ayuda teeth smile
Un saludo!
La verdad que lo que dijiste de los botones, y las variables.. no entendí un pomo teeth smile

Pero me alegro mucho de que lo hayas resuleto!!! teeth smile teeth smile teeth smile teeth smile

extract($_POST) declara como variables globales cada elemento del array, poniendo como nombre de la variable el índice correspondiente en el array.

Como medida de seguridad, recuerda siempre no confiarte en las variables recibidas por POST, GET o COOKIES, es un tema a parte pero un buen principio como para que lo mencione de nuevo.

Una alegría que funcione!

Saludos!