PHP como simple CGI en Apache Windows.

Por lo general paso la mayor parte del tiempo programando en Linux, pero a veces debo usar otros entornos como windows,  por lo que esta vez mostrare una forma diferente de configurar PHP en windows, la mas común es configurar el PHP como modulo, pero también se puede hacer como CGI  aplicando la siguiente configuración en el httpd.conf  de Apache (esto servirá para versión 2.2.x)

# php configuration as CGI
ScriptAlias /php/ "c:/php/"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
Action application/x-httpd-php "/php/php-cgi.exe"
SetEnv PHPRC C:/php
<Directory "C:/php">
    AllowOverride All
    Options None
    Order allow,deny
    Allow from all
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

Asumiendo que PHP fue extraído en el directorio “c:/php” definimos el script action(el ejecutable del CGI), los types( para el manejo de las extensiones .php ), el script alias(ubicación del php), el SetEnv PHPRC para la ubicación del archivo de configuración y las directivas para el directorio.

Reiniciamos el servicio y con esto bastara para tener funcionando el PHP como un simple CGI en Apache 2.2.x.
la ventaja de usar el PHP como CGI es que cuando cambies la configuración del “php.ini” no sera necesario reiniciar el servicio.

Configurando sun web server 7 con el PHP de Linux

En un post anterior habia mostrado como instalar el Sun Web Server 7  en Fedora8 utilizando el agregado PHP provisto por Sun,  el agregado esta bien si solo deseas utilizar las funciones mas comunes o basicas del PHP5, por lo general el PHP incluido en las distribuciones de linux viene con mas extensiones que le brinda caracteristicas adicionales al lenguaje.

Ahora bien para usar el PHP5 que viene con la distribuccion de Linux solo necesitamos hacer un par de ajustes al archivo obj.conf .

Service type="magnus-internal/php"
fn="responder-fastcgi"
bind-path="localhost:3101"
app-path="/usr/bin/php-cgi"
app-env="PHP_FCGI_CHILDREN=2"
app-env="PHP_FCGI_MAX_REQUEST=200"
app-env="FCGI_WEB_SERVER_ADDRS=127.0.0.1"
app-env="LD_LIBRARY_PATH=/usr/lib/php"

agregamos la ruta hacia el cgi de php en el “app-path”, y la ruta donde estan las extensiones por lo general es “/usr/lib/php” en “app-env”

luego en la consola de administracion hacemos un pull & deploy de la configuracion y listo tendremos PHP5 que viene con la distro y todas las extensiones trabajando con nuestro Sun Web Server 7.

PHP, tokens y Forms

Por lo general es una buena practica garantizar la integridad de los datos que se envia desde un formulario a un script en la web, para ello se pueden utilizar varias tecnicas como: solo buscar por datos esperados en los campos del formulario, usar un codigo captcha y en mi opinion una de las mejores tecnicas utilizar un token para validar la integridad de los datos.

para demostracion un pequeño codigo de ejemplo:

<?php
// codigo en el encabezado del form
$randomkey = "suP3rR4nDKeY";
$fixedkey = "123lsdlas345"
$salt = time(); // correspondera a un id que se enviara en un campo oculto
// token debera ir en un campo oculto del formulario.
$token = sha1($randomkey . $fixedkey . $salt);
?>
<input id="id" name="id" type="hidden" value="<?php echo $salt; ?>" />
<input id="token" name="token" type="hidden" value="<?php echo $token; ?>" />

Una vez generado el token este sera validado por el script que recibira la informacion del formulario verificado el token garantizara que los datos son validos y han sido enviados desde nuestro formulario.

Una vez validadas las entradas y teniendo los datos del id y el token se regenera el token para comprobarlo usando las 2 key que se usaron el formulario

// $id_form es el id obtenido del formulario
// $form_token es el token del formulario
$randomkey = "suP3rR4nDKeY";
$fixedkey = "123lsdlas345"
$check_token = sha1($randomkey . $fixedkey . $id_form);
if ($form_token == $check_token ) {
print "form data esta OK";
} else {
die("Token invalido");
}

asi con el uso del token se garantiza la integridad de los datos y su procedencia, si alguien quisiera atacar el form tendria que conocer las llaves y el timestamp que se genera al cargar el form, adicionalmente siempre es recomendable realizar una doble validacion una utilizando javascript y en caso de ser deshabilitado, contar con una validacion php o en el lenguaje que se utilice para procesar el formulario.