seguridad consultas ajax de 3W

Escribo esto a modo de colaboración y consulta en simultáneo.
Primero que nada la consulta, ¿ya hay algo implementado para validar las sesiones antes de cada acción ajax? Me ha pasado de que si la sesión caduca y se llama a una acción ajax el resultado del ajax es procesado normalmente y se lo muestra en pantalla como si fuese un archivo de texto plano.

Mi resolución… validar un token generado en la sesión, pasado al cargar la ṕágina, devuelto al hacer la llamada ajax y validado antes de procesar la accion.

  1. En el prepare() del paglet:
        if (empty($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        }
        $this->data['csrf_token'] = $_SESSION['csrf_token'];
  1. En el twig que arma la página:
        <meta name="csrf-token" content="{{ this.data.csrf_token }}"/>
  1. En el js donde se llama a la acción usando ajax:
        kernel.ajax.call(info.url, {
                dataType: 'json',                headers: {'CsrfToken': $('meta[name="csrf-token"]').attr('content')},
                ...
  1. En cada accion__ del controlador:
    public function accion__getDatosAjax() {
        $this->validar_sesion_ajax();        ...    }
    private function validar_sesion_ajax() {
        if (empty($_SESSION['csrf_token'])) {
            $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
        }
        header('Content-Type: application/json');
        $headers = apache_request_headers();
        $rta['cod']=-1;
        if (isset($headers['CsrfToken'])) {
            if ($headers['CsrfToken'] !== $_SESSION['csrf_token']) {
                $rta['cont']='Token CSRF inválido.';
                $this->render_raw_json($rta);
            }
        } else {
            $rta['cont']='Falta token CSRF.';
            $this->render_raw_json($rta);
        }
    }

Para más data pueden leer este link (en el que me basé para todo lo anterior): https://codeday.me/es/qa/20190301/268381.html

El único detalle feo es que tuve que editar un archivo original del SIU :(Las llamadas ajax no admitian enviar datos en el header). Me alcanzó con el agregado que a continuación dejo resaltado en negrita:

    ...
    call: function (url, options) {
        var default_options = {
            dataType: 'json',
            type: 'GET',
            async: true,
            data: {},
            show_loading: true,
            redirect: true,
            success: function () {},
            complete: function () {},
            error: false,
            undo: false,

headers: {}
};

        ...            var promise = $.ajax({
            url: url,
            dataType: options.dataType,
            data: options.data,
            async: options.async,
            type: options.type,
            contentType: options.contentType,
            processData: options.processData,

headers: options.headers
}) …

Hola
¿En que versión se encuentran? ¿En que operación sucede ?
Muchas gracias
Saludos

Estamos en versión 3.16.2 y en especifico me pasó en una operación propia por eso mismo implementé una solución similar a la publicada.

Hola Diego,

¿Esta nueva operación la registraron en un archivo de acceso (ubicados en la carpeta src/siu/acceso)? Fíjate que hay uno por cada perfil (acc_Alumno.php, acc_Docente.php, etc).

Si la persona es un alumno, y la operación la tenes registrada en acc_Alumno.php, si se cierra la sesión no le va a dejar acceder a la mismas (ya sea por navegación normal o por AJAX).

Lo que puede llegar a pasar es que esa operación también la tengas para el perfil anónimo (acc_anonimo.php), entonces ahí si te va a dejar acceder una vez cerrada la sesión.

Revisa que no se trate de este ultimo caso.

saludos.

Los archivos acc_ los tengo personalizados a todos…En particular, el caso en cuestión se da en acc_Docentes y es una nueva zona

    'zona_turnos' => array(
        'activa' => true,
        'menu' => array(
            'visible' => true,
        )
    ),

Pero bueno. Lo cierto es que quería compartirles la validación extra… no me molesta que si se vence la sesión muestre un mensaje de error como resultado de la llamada ajax :smiley:

Hola Diego, gracias por la información!!!

Hicimos una prueba, y tanto por AJAX como por navegación normal, al cerrarse la sesión del usuario no te deja efectuar la operación.

Supongamos que en src/pers/ejemplo01/conf/acceso/acc_Docente.php agregaste zona_turnos, y queres hacer un AJAX a [b]http://3w/zona_turnos/guardar[/b]. Si el usuario es docente te va a dejar, si en el medio se le cierra la sesión no te va a dejar hacer el AJAX, ya que al cerrarse la sesión dejaste de ser docente y perdes el permiso a dicha operación.

Lo que si verifica es que zona_turnos NO este en src/pers/ejemplo01/conf/acceso/acc_anonimo.php, sino te va dejar ingresar incluso sin sesión.

¿las llamadas AJAX las estas haciendo con kernel.ajax.call o directamente con las funciones de jQuery?

saludos.