Proteger parametros en funcion Javascript. Ayuda!

Hola gente:
Tengo un código php que genera un código HTML, en concreto esta línea:

$seguir .= "<a class='boton_m_seguir' id='mi_boton' href='javascript:seguir($userm->id, $idevento);'> blablabla</a>";

El tema es que como veréis, al poner el raton encima del botón, se muestra en algunos navegadores en la parte inferior la llamada que se hace a la función seguir de JavaScript, y además muestra los valores de userm e idevento.
Una cagada gorda, vaya.

Que narices puedo hacer para evitar esto? Como oculto estos valores?
o mejor aun...

¿Cómo podría hacer para llamar a la función JavaScript al pulsar el botón, y que no se vea que se hace una llamada a esa función??

Gracias!
Puedes no poner la llamada en el href, pero aunque uses el onClick o algo asi, el codigo va a estar ahi, de manera que si estas pasando parametros que no deberian ver... van a seguir pudiendolo ver XD
JanKusanagi escribió:Puedes no poner la llamada en el href, pero aunque uses el onClick o algo asi, el codigo va a estar ahi, de manera que si estas pasando parametros que no deberian ver... van a seguir pudiendolo ver XD

y entonces que hago? :-S
Encríptalos y en la función los desencriptas pero vamos, el código js también es visible por el cliente.
RC9 escribió:Encríptalos y en la función los desencriptas pero vamos, el código js también es visible por el cliente.

Pero el problema es, que aun que lo encripte, si el usuario quiere pone cualquier chorrada, o quiere poner otro numero, aun q no este encriptado, va a modificar la bd.

La función seguir, es una función JavaScript que usa AJAX, para modificar uno valor en la BD, en función el estado del botón.
Haz una comprobación antes de insertar para ver si los parámetros son correctos, no se me ocurre otra.
RC9 escribió:Haz una comprobación antes de insertar para ver si los parámetros son correctos, no se me ocurre otra.

Los valores no se insertan... los reocojo yo mediante phh, y el usuario no debería de poder modificarlos :-S
Daicon escribió:
RC9 escribió:Haz una comprobación antes de insertar para ver si los parámetros son correctos, no se me ocurre otra.

Los valores no se insertan... los reocojo yo mediante phh, y el usuario no debería de poder modificarlos :-S


JS siendo un lenguaje que se ejecuta en el cliente puede ser modificado por el usuario. Esto es así y no va a poder cambiarse. Lo que puedes hacer es algún tipo de comprobación primero en JS y después en PHP.
No utilizas ninguna librería JavaScript? Si usas jQuery, por ejemplo, podrías hacer un binding en el evento click de la clase boton_m_seguir, y en el href pones una url alternativa para hacer la misma función en caso de que el usuario no tenga JS o su navegador no soporte los métodos utilizados.

Sobre la visibilidad de los parámetros, si $userm es el usuario actual de la sesión, lo mejor es no pasarlo como parámetro, sino leerlo directamente en la petición en la que vayas a utilizar el dato. En dicha petición, lees el usuario, mira si tiene permiso para realizar la acción, y si es así la ejecutas. Qué más te da que se pueda poner a hacer tonterías? Total, si tiene permiso para hacerlo lo podrá hacer igual desde la interfaz. Si no quieres que haga algo, restríngelo en la aplicación vía permisos.

Eso sí, realizar operaciones a través de una petición GET no es lo más recomendable, ya que get se debería usar sólo para consulta de datos. Así que podrías crear un formulario con un campo hidden idevento y un botón de envío, y hacer un submit vía ajax con el evento click de ese mismo botón. En jQuery (>1.7) sería algo así:

Al final de la etiqueta HEAD:
$(document).ready(function() {
    $('body').on('submit', '.envio-con-ajax', function(event) {
        event.preventDefault();
        $.post($(this).attr('action'), $(this).serialize())
            .done(function(data) {
                alert('Éxito!');
            })
           .fail(function(data) {
                alert('Fallo!');
            });
        return false;
    });
});


En el BODY:
<form class="envio-con-ajax" action="url-de-destino-al-que-mandar-los-datos-para-su-guardaddo" method="post">
    <input type="hidden" name="evento" value="<?php echo $idevento; ?>" />
    <button type="submit">Seguir</button>
</form>


Si el usuario que pasas como parámetro no fuese el mismo, sólo tienes que añadir otro campo hidden con el id, pero ya te digo, si el usuario es el mismo de la sesión, deberías cargar su identificador de la propia sesión para ahorrarte disgustos.

Con todo esto, tu aplicación será algo más segura y en caso de que el usuario no tenga JavaScript o su navegador se haga un lío (hola IE), la aplicación seguirá siendo totalmente funcional.
Maxtorete escribió:No utilizas ninguna librería JavaScript? Si usas jQuery, por ejemplo, podrías hacer un binding en el evento click de la clase boton_m_seguir, y en el href pones una url alternativa para hacer la misma función en caso de que el usuario no tenga JS o su navegador no soporte los métodos utilizados.

Sobre la visibilidad de los parámetros, si $userm es el usuario actual de la sesión, lo mejor es no pasarlo como parámetro, sino leerlo directamente en la petición en la que vayas a utilizar el dato. En dicha petición, lees el usuario, mira si tiene permiso para realizar la acción, y si es así la ejecutas. Qué más te da que se pueda poner a hacer tonterías? Total, si tiene permiso para hacerlo lo podrá hacer igual desde la interfaz. Si no quieres que haga algo, restríngelo en la aplicación vía permisos.

Eso sí, realizar operaciones a través de una petición GET no es lo más recomendable, ya que get se debería usar sólo para consulta de datos. Así que podrías crear un formulario con un campo hidden idevento y un botón de envío, y hacer un submit vía ajax con el evento click de ese mismo botón. En jQuery (>1.7) sería algo así:

Al final de la etiqueta HEAD:
$(document).ready(function() {
    $('body').on('submit', '.envio-con-ajax', function(event) {
        event.preventDefault();
        $.post($(this).attr('action'), $(this).serialize())
            .done(function(data) {
                alert('Éxito!');
            })
           .fail(function(data) {
                alert('Fallo!');
            });
        return false;
    });
});


En el BODY:
<form class="envio-con-ajax" action="url-de-destino-al-que-mandar-los-datos-para-su-guardaddo" method="post">
    <input type="hidden" name="evento" value="<?php echo $idevento; ?>" />
    <button type="submit">Seguir</button>
</form>


Si el usuario que pasas como parámetro no fuese el mismo, sólo tienes que añadir otro campo hidden con el id, pero ya te digo, si el usuario es el mismo de la sesión, deberías cargar su identificador de la propia sesión para ahorrarte disgustos.

Con todo esto, tu aplicación será algo más segura y en caso de que el usuario no tenga JavaScript o su navegador se haga un lío (hola IE), la aplicación seguirá siendo totalmente funcional.


Aver, entiendo, lo que dices,, y te explico un poco.
El tema es que utilizo joomla, y hay qu estar con el MVC, y es un poco mas coñazo que eso que me has puesto, y aun estoy aprendiendo.

Tal y como dices, he conseguido obviar el id del usuario.
Pero el problema es el idevento.

Desde el controlador del componente principal, he conseguido acceder al id del usuario actual, asi que ese parámetros desaparece.
El problema es el idevento, que no encuentro forma de conseguirlo sin pasárselo como ahora mismo esta.

En Joomla esta el framework Mootoolos, hay algo similar a lo que me has dicho de Jquery? Podria ser una ayuda.

El problema de que se ponga a tonterar, es que si empiza a poner ids de eventos que no existen, o aleatorias, pues podría empezar a causar problemas (tal vez) en la BD.
Daicon escribió:
Maxtorete escribió:No utilizas ninguna librería JavaScript? Si usas jQuery, por ejemplo, podrías hacer un binding en el evento click de la clase boton_m_seguir, y en el href pones una url alternativa para hacer la misma función en caso de que el usuario no tenga JS o su navegador no soporte los métodos utilizados.

Sobre la visibilidad de los parámetros, si $userm es el usuario actual de la sesión, lo mejor es no pasarlo como parámetro, sino leerlo directamente en la petición en la que vayas a utilizar el dato. En dicha petición, lees el usuario, mira si tiene permiso para realizar la acción, y si es así la ejecutas. Qué más te da que se pueda poner a hacer tonterías? Total, si tiene permiso para hacerlo lo podrá hacer igual desde la interfaz. Si no quieres que haga algo, restríngelo en la aplicación vía permisos.

Eso sí, realizar operaciones a través de una petición GET no es lo más recomendable, ya que get se debería usar sólo para consulta de datos. Así que podrías crear un formulario con un campo hidden idevento y un botón de envío, y hacer un submit vía ajax con el evento click de ese mismo botón. En jQuery (>1.7) sería algo así:

Al final de la etiqueta HEAD:
$(document).ready(function() {
    $('body').on('submit', '.envio-con-ajax', function(event) {
        event.preventDefault();
        $.post($(this).attr('action'), $(this).serialize())
            .done(function(data) {
                alert('Éxito!');
            })
           .fail(function(data) {
                alert('Fallo!');
            });
        return false;
    });
});


En el BODY:
<form class="envio-con-ajax" action="url-de-destino-al-que-mandar-los-datos-para-su-guardaddo" method="post">
    <input type="hidden" name="evento" value="<?php echo $idevento; ?>" />
    <button type="submit">Seguir</button>
</form>


Si el usuario que pasas como parámetro no fuese el mismo, sólo tienes que añadir otro campo hidden con el id, pero ya te digo, si el usuario es el mismo de la sesión, deberías cargar su identificador de la propia sesión para ahorrarte disgustos.

Con todo esto, tu aplicación será algo más segura y en caso de que el usuario no tenga JavaScript o su navegador se haga un lío (hola IE), la aplicación seguirá siendo totalmente funcional.


Aver, entiendo, lo que dices,, y te explico un poco.
El tema es que utilizo joomla, y hay qu estar con el MVC, y es un poco mas coñazo que eso que me has puesto, y aun estoy aprendiendo.

Tal y como dices, he conseguido obviar el id del usuario.
Pero el problema es el idevento.

Desde el controlador del componente principal, he conseguido acceder al id del usuario actual, asi que ese parámetros desaparece.
El problema es el idevento, que no encuentro forma de conseguirlo sin pasárselo como ahora mismo esta.

En Joomla esta el framework Mootoolos, hay algo similar a lo que me has dicho de Jquery? Podria ser una ayuda.

El problema de que se ponga a tonterar, es que si empiza a poner ids de eventos que no existen, o aleatorias, pues podría empezar a causar problemas (tal vez) en la BD.


Pero es que esas posibilidades de tontear debes controlarlas en el controlador: mirar si el id de evento existe, si el usuario tiene permiso para ver/seguir ese evento, si el usuario está siguiendo ya el evento o no, etc. Toda esa capa de negocio la tienes que meter obligatoriamente en el controlador, independientemente de lo oculto que tengas los parámetros, porque sino cualquier aburrido se dedica a hacerle peticiones al servidor y te lo peta en 0,2.

Nunca he trabajado con Mootools, pero no creo que sea muy complicado pasar esa función de jQuery a ese framework, es cuestión de ver la documentación de referencia y cambiar las funciones/parámetros que cambien, pero supongo que la lógica será la misma (interceptar el evento submit para hacerlo vía ajax y según la respuesta del servidor hacer una cosa u otra).
Que Joomla use el frameworks Mootools no impide que uses jQuery, de hecho, te lo digo por propia experiencia que llevo una racha de tener que modificar Joomlas increíble y la mayoría de plantillas vienen con jQuery incluído.

Y ten en cuenta que no puedes dejar sin comprobar los valores que vayas a meter en la base de datos nunca, tanto en js como en php.
Tanto si está oculto como si no, nunca te fíes de ningún dato que llega desde el cliente.

Si te llega un dato, deberás verificar que realmente ese dato es posible. Por ejemplo, si el usuario que envías es el propio que está registrado, puedes eliminarlo, solo envías "idevento" y obtienes el usuario desde php usando la variable de sesión, al igual que habrás hecho en el php que genera el javascript.

También deberás comprobar que el evento al que está intentando seguir está disponible para el usuario y si no está siguiéndolo ya.
Maxtorete escribió:
Daicon escribió:
Maxtorete escribió:No utilizas ninguna librería JavaScript? Si usas jQuery, por ejemplo, podrías hacer un binding en el evento click de la clase boton_m_seguir, y en el href pones una url alternativa para hacer la misma función en caso de que el usuario no tenga JS o su navegador no soporte los métodos utilizados.

Sobre la visibilidad de los parámetros, si $userm es el usuario actual de la sesión, lo mejor es no pasarlo como parámetro, sino leerlo directamente en la petición en la que vayas a utilizar el dato. En dicha petición, lees el usuario, mira si tiene permiso para realizar la acción, y si es así la ejecutas. Qué más te da que se pueda poner a hacer tonterías? Total, si tiene permiso para hacerlo lo podrá hacer igual desde la interfaz. Si no quieres que haga algo, restríngelo en la aplicación vía permisos.

Eso sí, realizar operaciones a través de una petición GET no es lo más recomendable, ya que get se debería usar sólo para consulta de datos. Así que podrías crear un formulario con un campo hidden idevento y un botón de envío, y hacer un submit vía ajax con el evento click de ese mismo botón. En jQuery (>1.7) sería algo así:

Al final de la etiqueta HEAD:
$(document).ready(function() {
    $('body').on('submit', '.envio-con-ajax', function(event) {
        event.preventDefault();
        $.post($(this).attr('action'), $(this).serialize())
            .done(function(data) {
                alert('Éxito!');
            })
           .fail(function(data) {
                alert('Fallo!');
            });
        return false;
    });
});


En el BODY:
<form class="envio-con-ajax" action="url-de-destino-al-que-mandar-los-datos-para-su-guardaddo" method="post">
    <input type="hidden" name="evento" value="<?php echo $idevento; ?>" />
    <button type="submit">Seguir</button>
</form>


Si el usuario que pasas como parámetro no fuese el mismo, sólo tienes que añadir otro campo hidden con el id, pero ya te digo, si el usuario es el mismo de la sesión, deberías cargar su identificador de la propia sesión para ahorrarte disgustos.

Con todo esto, tu aplicación será algo más segura y en caso de que el usuario no tenga JavaScript o su navegador se haga un lío (hola IE), la aplicación seguirá siendo totalmente funcional.


Aver, entiendo, lo que dices,, y te explico un poco.
El tema es que utilizo joomla, y hay qu estar con el MVC, y es un poco mas coñazo que eso que me has puesto, y aun estoy aprendiendo.

Tal y como dices, he conseguido obviar el id del usuario.
Pero el problema es el idevento.

Desde el controlador del componente principal, he conseguido acceder al id del usuario actual, asi que ese parámetros desaparece.
El problema es el idevento, que no encuentro forma de conseguirlo sin pasárselo como ahora mismo esta.

En Joomla esta el framework Mootoolos, hay algo similar a lo que me has dicho de Jquery? Podria ser una ayuda.

El problema de que se ponga a tonterar, es que si empiza a poner ids de eventos que no existen, o aleatorias, pues podría empezar a causar problemas (tal vez) en la BD.


Pero es que esas posibilidades de tontear debes controlarlas en el controlador: mirar si el id de evento existe, si el usuario tiene permiso para ver/seguir ese evento, si el usuario está siguiendo ya el evento o no, etc. Toda esa capa de negocio la tienes que meter obligatoriamente en el controlador, independientemente de lo oculto que tengas los parámetros, porque sino cualquier aburrido se dedica a hacerle peticiones al servidor y te lo peta en 0,2.

Nunca he trabajado con Mootools, pero no creo que sea muy complicado pasar esa función de jQuery a ese framework, es cuestión de ver la documentación de referencia y cambiar las funciones/parámetros que cambien, pero supongo que la lógica será la misma (interceptar el evento submit para hacerlo vía ajax y según la respuesta del servidor hacer una cosa u otra).



Ya, ya empiezo a ver que tengo que controlar estas cosas desde el controlador, pero no encuentro la forma de conseguir el idevento desde el controlador s:

Es verdad que me falta muchas comprobaciones que mejorarían la.cosa, como ver si el evento existe.en.la.bd. No me hace falta ver si el usuario tiene permiso para seguirlo. Eso digamos que está controlado.

Pero aún así sería posible que el usuario se dedicará a seguir todos los eventos desde el evento que quisiera.

El id del evento, en realidad se ve en la url cuando accedes a un evento, y eso no me importa.
Si pudiera acceder desde el controlador a la url actual, podría coger el id del evento, y no tener que pasarlo por parámetro.
El componente este de joomla, es bastante grande, y me está siendo complicando obtener el iddelevento de otra forma que no.sea desde el view.html.php .

Alguna idea?

EDITO:

Bueno, pues añado otra solución que me acabo de encontrar en otro foro, que me he quedado flipado, y no se como no me lo han dicho en otros sitios, lo dejo aquí a ver si le veis algún inconveniente.

Usar SESIONES.

Guardo el idevento, cuando se esta creando la vista HTML del evento donde se encuentra el usuario:

session_start();
$_SESSION['idevent'] = $idevento;

Y recupero desde el controlador del componente, sin necesidad de pasarle parámetros a la función seguir JavaScript que tenia!!!!
session_start();
$auxevento = $_SESSION['idevent'];


O_o

¿Lo veis buena solución?
Pero qué más te da que se ponga a seguir eventos como un loco? Si tiene permisos para hacerlo, pues que lo haga si quiere. La forma correcta de que el usuario no haga esas tonterías es generar un token de seguridad en cada formulario (Drupal y Symfony, por ejemplo, lo hacen, no sé si es el caso de Joomla).

La solución de utilizar la sesión no te la recomiendo en absoluto, al principio puede funcionar y parecer buena idea, pero cuando empiece a fallar y tengas que depurar, te acordarás de esa decisión. Formulario y petición post, no hay más, sin importar la visibilidad de un parámetro. Si lo hacen Facebook, Twitter, Google y compañía, será por algo no?
Maxtorete escribió:Pero qué más te da que se ponga a seguir eventos como un loco? Si tiene permisos para hacerlo, pues que lo haga si quiere. La forma correcta de que el usuario no haga esas tonterías es generar un token de seguridad en cada formulario (Drupal y Symfony, por ejemplo, lo hacen, no sé si es el caso de Joomla).

La solución de utilizar la sesión no te la recomiendo en absoluto, al principio puede funcionar y parecer buena idea, pero cuando empiece a fallar y tengas que depurar, te acordarás de esa decisión. Formulario y petición post, no hay más, sin importar la visibilidad de un parámetro. Si lo hacen Facebook, Twitter, Google y compañía, será por algo no?

:-S, pues vaya, ¿Por que iba a empezar a fallar? en otros sitios me la han recomendado mucho.
La verdad es que me gustaría hacerlo bien... pero no se como.
Formulario? para que quiero un formulario? No necesito rellenar nada, el idevento, lo obtengo yo de forma transparente al usuario.
Y aun que digas que la visilidad no importa, se que puede llegar a importar, no entiendo por que dices que no importa.
Como puedo hacer un envio post, que envie un dato, (no pueda ser modificado desde el cliente), y lo reciba en el controlador?
15 respuestas