[Pregunta]: ¿Como podría ejecutar solamente un <script> en un archivo ajax?

Iniciado por Leguim, 17 Agosto 2019, 20:32 PM

0 Miembros y 2 Visitantes están viendo este tema.

Leguim

Buenos días...
Estaría teniendo el siguiente problema y es que tengo una función ajax donde lo que hace es sumar dos valores, valor A y valor B. En base a estos dos resultados se los suma y muestra el resultado en forma de "alert();" a través de un <script> en un fichero .php

Es decir, digamos:
Código (javascript) [Seleccionar]

var valor_a = 3;
var valor_b = 4;

Sumar(valor_a, valor_b);


La función Sumar:
Código (javascript) [Seleccionar]

function Sumar(value_a, value_b)
{
     var resultado_suma = valor_a + valor_b;
    $.ajax({
         url: 'archivo_ajax.php',
 type: 'POST',
 dataType: 'html',
 data: {resultado_suma},
    })

    .done(function(results)
    {
 $('body').html(results);
    })
}


Fichero ajax.php:
Código (php) [Seleccionar]

?>
<script type="text/javascript>
alert('<?php echo($_POST['resultado_suma']); ?>');
</script>
<?php


Como pueden ver lo único que hago es ejecutar un <script> siempre como norma general para ejecutar códigos utilizando AJAX los hago similar a esto, donde tengo que agregar código html pero ahora que solamente quiero ejecutar un script y nada más nose como hacerlo por que al poner en la función ajax .html(results); el body se pone todo blanco desaparece mi pagina queda todo en blanco.

Espero poderme haber dado a entender, Muchas gracias!

WHK

Hola, asi es, se pone en blanco porque le estás diciendo a jquery que todo el contenido body tendrá tu texto en html, en ves de eso debes utilizar .append().

Adicionalmente te recomiendo que no continues programando de esa manera, en ves de obtener código html y pegarlo en el sitio web puedes solamente obtener código javascript y ejecutarlo con eval(), de esa manera no tendrás necesidad de estar pegando código html.

Saludos.

MinusFour

No hay ninguna razón para enviar código en javascript o evaluarlo así. Si necesitas obtener información te montas una API que regrese los datos en JSON. No tienes porque enviar información por <script>s.

#!drvy

CitarNo hay ninguna razón para enviar código en javascript o evaluarlo así. Si necesitas obtener información te montas una API que regrese los datos en JSON. No tienes porque enviar información por <script>s.

+1


Además en este caso, si solo quieres mostrar el alert, no bastaría con poner el alert en el done.


Saludos

Leguim

#4
Cita de: WHK en 17 Agosto 2019, 21:13 PM
Hola, asi es, se pone en blanco porque le estás diciendo a jquery que todo el contenido body tendrá tu texto en html, en ves de eso debes utilizar .append().

Adicionalmente te recomiendo que no continues programando de esa manera, en ves de obtener código html y pegarlo en el sitio web puedes solamente obtener código javascript y ejecutarlo con eval(), de esa manera no tendrás necesidad de estar pegando código html.

Saludos.

Muchas gracias a los tres por responderme!

Es decir para ir mostrando registros de 5 en 5. de ante mano muestre 5 y luego al tocar un botón de ver más muestre otros 5, estoy usando esa manera de agregar código html como sería hacerlo con eval() ?
Representa alguna vulnerabilidad hacerlo así?

Gracias por tu respuesta me sirvio mucho!!

"No hay ninguna razón para enviar código en javascript o evaluarlo así. Si necesitas obtener información te montas una API que regrese los datos en JSON. No tienes porque enviar información por <script>s."

  - Hola! me podrías decir como es eso? parece interesante

"Además en este caso, si solo quieres mostrar el alert, no bastaría con poner el alert en el done.


Saludos"

   - Hola! Si te referís a como hice este pequeño sistema, generalmente siempre que tengo un problema y creo un tema lo hago usando la base del problema. El sistema en realidad es mucho mas complejo y robusto que los sistemas que comento. El alert no importa realmente son solo bases que uso para explicar el problema.

Gracias a los 3!

MinusFour

Cita de: MiguelCanellas en 17 Agosto 2019, 22:25 PM
Muchas gracias a los tres por responderme!

Es decir para ir mostrando registros de 5 en 5. de ante mano muestre 5 y luego al tocar un botón de ver más muestre otros 5, estoy usando esa manera de agregar código html como sería hacerlo con eval() ?
Representa alguna vulnerabilidad hacerlo así?

Gracias por tu respuesta me sirvio mucho!!

La diferencia es que regresarías el string sin los <script>s:

Código (php) [Seleccionar]

alert('<?php echo($_POST['resultado_suma']); ?>');


Y en tu código:

Código (js) [Seleccionar]

    .done(function(results)
    {
 eval(results);
    })


Pero para efectos de seguridad viene siendo lo mismo. Por ejemplo, en tu caso estás haciendo una suma de 2 variables y una persona pudiera pensar que es seguro porque si tu sumas otra cosa que son números resulta en NaN (Not A Number) , por lo que una persona pudiera pensar que el dato que se va enviar en tu función Suma está restringida a números solamente.

Pero en javascript, el operador + se utiliza para concatenar strings también... y aquí empiezan los problemas sobre valor_a y valor_b. Si una persona tiene control sobre valor_a y valor_b pueden cambiar los valores, por ejemplo si se corre lo siguiente:

Código (javascript) [Seleccionar]

valor_a = "", valor_b ="'); $('body').html('XSS";
Suma(valor_a, valor_b);


Te sale un alert y luego puedes ejecutar cualquier cosa en javascript. Bueno, este es solo un ejemplo, modificar valor_a y valor_b también tiene su gracia. Puedes modificar la funciona de Suma para que solo trabaje con números:

Código (javascript) [Seleccionar]

var resultado_suma = Number(valor_a) + Number(valor_b);


¿Pero porque? Tu servidor puede simplemente regresar el número:

Código (php) [Seleccionar]

echo($_POST['resultado_suma']);


Y tu javascript solo tiene que hacer esto:

Código (javascript) [Seleccionar]
.done(function(results)
{
 alert(results);
});


Y si quieres estar seguro que vaya a ser un numero usas Number para asegurarte que te regrese un número siempre.

Si quieres trabajar con diferentes tipos de datos, como strings, numeros, objetos, arreglos, etc tienes JSON.

Si vas a manejar código, lo vas a tener que sobre un DSL que este diseñado para ser seguro. No es MUY díficil con las herramientas que existen hoy para trabajar con lenguajes pero tiene su costo en rendimiento obviamente.

Edit: y si como dice #!drvy también puedes poner

Código (javascript) [Seleccionar]

.done(alert);


Que no hay necesidad de la función anónima extra.

Leguim

Cita de: MinusFour en 17 Agosto 2019, 22:53 PM
La diferencia es que regresarías el string sin los <script>s:

Código (php) [Seleccionar]

alert('<?php echo($_POST['resultado_suma']); ?>');


Y en tu código:

Código (js) [Seleccionar]

    .done(function(results)
    {
 eval(results);
    })


Pero para efectos de seguridad viene siendo lo mismo. Por ejemplo, en tu caso estás haciendo una suma de 2 variables y una persona pudiera pensar que es seguro porque si tu sumas otra cosa que son números resulta en NaN (Not A Number) , por lo que una persona pudiera pensar que el dato que se va enviar en tu función Suma está restringida a números solamente.

Pero en javascript, el operador + se utiliza para concatenar strings también... y aquí empiezan los problemas sobre valor_a y valor_b. Si una persona tiene control sobre valor_a y valor_b pueden cambiar los valores, por ejemplo si se corre lo siguiente:

Código (javascript) [Seleccionar]

valor_a = "", valor_b ="'); $('body').html('XSS";
Suma(valor_a, valor_b);


Te sale un alert y luego puedes ejecutar cualquier cosa en javascript. Bueno, este es solo un ejemplo, modificar valor_a y valor_b también tiene su gracia. Puedes modificar la funciona de Suma para que solo trabaje con números:

Código (javascript) [Seleccionar]

var resultado_suma = Number(valor_a) + Number(valor_b);


¿Pero porque? Tu servidor puede simplemente regresar el número:

Código (php) [Seleccionar]

echo($_POST['resultado_suma']);


Y tu javascript solo tiene que hacer esto:

Código (javascript) [Seleccionar]
.done(function(results)
{
 alert(results);
});


Y si quieres estar seguro que vaya a ser un numero usas Number para asegurarte que te regrese un número siempre.

Si quieres trabajar con diferentes tipos de datos, como strings, numeros, objetos, arreglos, etc tienes JSON.

Si vas a manejar código, lo vas a tener que sobre un DSL que este diseñado para ser seguro. No es MUY díficil con las herramientas que existen hoy para trabajar con lenguajes pero tiene su costo en rendimiento obviamente.

Edit: y si como dice #!drvy también puedes poner

Código (javascript) [Seleccionar]

.done(alert);


Que no hay necesidad de la función anónima extra.

Muchas gracias voy a ver que onda con eso!