Ajax en Coldfusion

Al igual que ya hice un manual básico de como centralizo la seguridad de las llamadas Ajax en Codeigniter, ahora me toca hacerlo para Coldfusion. Lo principal es que todas las llamadas sean a componentes y que estos a su vez se extiendan del Ajax.cfc que dejo a continuación:

component hint="componente securiza las llamadas de Ajax y carga los parametros que recibe la página"{

    variables.fields = {};

    package void function init(){
        headers = getHttpRequestData().headers;

        if(cgi.content_type eq 'application/json;charset=utf-8'){
            variables.fields = deserializeJSON(ToString(getHTTPRequestData().content));
        }else if(structKeyExists(headers, "X-Requested-With") and headers["X-Requested-With"] eq "XMLHttpRequest"){
            variables.fields = form;
        }else{
            cfheader(
                statuscode = 401,
                statustext = "Invalid Request"
            );
            abort;
        }

        if(not (structKeyExists(headers, "X-CSRF-TOKEN") and CSRFverifyToken(headers["X-CSRF-TOKEN"])) ){
            cfheader(
                statuscode = 401,
                statustext = "Invalid CSRF token"
            );
            abort;
        }
    }
}

Este lo que hace es que solo permitirá llamadas que estén mandando un JSON como contenido o que tengan una cabecera de petición por Ajax (X-Requested-With: XMLHttpRequest
). Tambien se encarga de comprobar que en la cabecera de las peticiones viene el parámetro X-CSRF-TOKEN que nos permitirá validar el token de la petición para evitar ataques CSRF. Por ultimo cargará todos los parámetros en una variable fields.

Un ejemplo de componente que se encargue del login por ejemplo sería así:

component extends="cfc.Ajax"{     

    remote any function login ( ) returnFormat="JSON" {
        this.init();

        if(not structKeyExists(variables.fields, 'email') or not isValid('email', variables.fields.email)) {
            cfheader(
                statuscode = 403,
                statustext = "Invalid Email"
            );                   
            return {};     
        }
        
        if(not structKeyExists(variables.fields, 'password') or len(variables.fields.password) eq 0) {
            cfheader(
                statuscode = 403,
                statustext = "Invalid Password"
            );            
            return {};
        }

        userObj = new cfc.User();
        result = userObj.login(email=variables.fields.email, password=variables.fields.password);        
        
        if(result.status neq 200){
            cfheader(
                statuscode = result.status,
                statustext = "Invalid Email or Password"
            );       
            return {};
        }else{             
 
            return result;
        }
    } 

}

Y para integrarlo con el html/javascript, lo primero sería meter en la cabecera de las páginas el token:

<meta name="csrf-token" content="<cfoutput>#CSRFGenerateToken()#</cfoutput>">

Y hacer que todas las peticiones de Ajax que hagamos con jQuery, le añada el token:

$.ajaxSetup({
	beforeSend: function (xhr){
		xhr.setRequestHeader('X-CSRF-TOKEN',document.querySelector("meta[name='csrf-token']").content);        
	}
});

O si usamos Axios en Vue:

window.axios.defaults.headers.common = {
	'X-Requested-With': 'XMLHttpRequest',
	'X-CSRF-TOKEN' : document.querySelector("meta[name='csrf-token']").content
};

Plugins de jQuery para subir y seleccionar ficheros

En el proyecto con el que estoy ahora me ha tocado integrar una plataforma de subida de ficheros que usarán distintas webs y he decidido montar dos plugins sencillitos de jQuery para simplificar su integración por parte de los maquetadores.

Se pueden descargarlo y ver como funcionan en mis repositorios de GitHub. Viene con ejemplos básicos de como integrarlo con Coldfusion y PHP

Subir con GIT a varios repositorios a la vez

Resulta que el servidor de la oficina que tenemos para GIT no se le hacen copias de seguridad así que se me ha ocurrido que cada vez que hacemos un push se suba a otro repositorio a la vez que a “oficial” por si acaso. Una alternativa sería hacerlo en el hook post-receibe del servidor pero como ya lo tengo con otras historias, casi prefiero hacerlo desde local. Para ello al repositorio origin le añado la ruta de otro repositorio que tengo en online:

git remote set-url --add --push origin git@RUTA_REPOSITORIO_ONLINE/repositorio_backup.git

Y listo, ahora cada vez que hago un push me lo sube a dos repositorios

Podemos ver el listado de repositorios remotos y las acciones sobre ellos con el comando:

git remote -v