Seguridad en javascript

Iniciado por Hagoromo, 4 Diciembre 2008, 14:45 PM

0 Miembros y 1 Visitante están viendo este tema.

Hagoromo

Buenas,

cómo puedo hacer segura una función en Js, la cual
hace una llamada con el método XMLHttpRequest?
El problema es que el usuario puede ver el código
fuente y ver cómo se hace esa llamada a la función,
por ejemplo, el borrado de un registro en la base de
datos.

Se podría "embeber" o algo así en código php para
que no se pueda ver la llamada?

Ejemplo de la función en javascript:

function actBDD(str) {
var r = new XMLHttpRequest();
r.open("GET", "xec.php?str=" + str, false);
r.send(null);
return r.responseText;
}


Y aquí el script xec.php para la conexión vía socket con la BDD:

<?php
function acceso($str) {
   $sck = fsockopen ....
   ....
}
$str = $_GET['str'];
...
?>


Gracias de antemano y espero haberme explicado
con claridad ;-)

дٳŦ٭

Pues mira, yo lo que haria es revisar el referer, si viene desde la pagina lo dejo pasar, sino lo bloqueo. La otra es que envies cifrado el id o pon una sesión y asigna permisos para dicha accion (pa que solo ese usuario pueda borrar ese id).

Saludos


Con sangre andaluza :)


Hagoromo

Gracias дٳŦ, le meteré esos dos filtros.

SaXo

No tiene mucho sentido lo que dices. Actualmente existen muchas api ajax que hacen eso mismo. Puedes mirarte la pagina de jquery y ver su codigo fuente siempre que te apetezca.

Encapsular una funcionalidad js en una funcion de php no suele ser la primera opcion. Puedes crearte una capa en php que realice callbacks a piezas en javascript como segunda opcion, o simplemente usar jquery para realizar tus callbacks a los elementos que realizan la logica de negocio.

Parece que hago publicidad de jquery, pero desde que la use para solucionar "un problema" me parece una herramienta muy util.

дٳŦ٭

Cita de: SaXo en  5 Diciembre 2008, 00:16 AM
No tiene mucho sentido lo que dices. Actualmente existen muchas api ajax que hacen eso mismo. Puedes mirarte la pagina de jquery y ver su codigo fuente siempre que te apetezca.

Encapsular una funcionalidad js en una funcion de php no suele ser la primera opcion. Puedes crearte una capa en php que realice callbacks a piezas en javascript como segunda opcion, o simplemente usar jquery para realizar tus callbacks a los elementos que realizan la logica de negocio.

Parece que hago publicidad de jquery, pero desde que la use para solucionar "un problema" me parece una herramienta muy util.


Pues si.. pero es mejor aprender desde 0.


Con sangre andaluza :)


Hagoromo

Cita de: SaXo en  5 Diciembre 2008, 00:16 AM
No tiene mucho sentido lo que dices. Actualmente existen muchas api ajax que hacen eso mismo. Puedes mirarte la pagina de jquery y ver su codigo fuente siempre que te apetezca.

Encapsular una funcionalidad js en una funcion de php no suele ser la primera opcion. Puedes crearte una capa en php que realice callbacks a piezas en javascript como segunda opcion, o simplemente usar jquery para realizar tus callbacks a los elementos que realizan la logica de negocio.

Perdón, pero no me he enterado de nada  :P
Podrías darme algún enlace con ejemplos?

Gracias y saludotes!

P[i]

Consejos:
1º pasa de javascript y escribe solo html que envie datos a un php. Una vez codificado esto testealo a prueba de cualquier vulneridad que pueda explotar el usuario (Sql,XSS Directo o Indirecto...)
2º ya puedes implementarlo con javasript da igual que el usuario pueda ver o no el codigo pues tu php (lo unico vulnerable) ya esta totalmente inmunizado.

Saludos.

Hagoromo

Perdonad si os parezco tontodelnabbo, pero estoy empezando
con PHP ...

tengo una página con una tabla llena de registros de la BDD,
y en la página hay un botón para eliminar el registro seleccionado,
tiene que haber javascript para realizar la acción (que quiero sea
dinámica). Por lo tanto, ese código javascript siempre será visible
en el lado cliente, y alguien malintencionado verá cómo hace la
llamada a la función php para borrar el registro de la BDD: el código
PHP no lo verá, pero sí los parámetros que pasamos con js hacia
el PHP ...

La pregunta es si esa persona malintencionada puede hacer algo
con esos parámetros, y reproducirlo en su máquina para atacar mi
BDD (puede llegar a saber la ip del servidor BDD).

Se podría hacer una página dinámica donde el usuario interactue
con ella, como el ejemplo anterior, con sólo PHP + HTML sin Js?
No sé si me he explicado bien, en caso contrario perdonadme :-)

He mirado por encima la librería JQUERY y esta muy bien, pero
prefiero aprender lo básico antes de complicarme más la vida...

Gracias de antemano!

P[i]

 Te esplico un poco mas en detalle (voy a poner tu ejemplo pero espero que
quede claro en general)

Antes de existir javascript (mas bien antes que existir ajax) la gente se apañaba
muy bien simplemente con html. Todo lo que hagas en js se puede hacer con html
(es mas facil para el usuario con js pero poder se puede)

  Lo primero es tener claro lo que se quiere. Ejemplo (espero que entendera bien
lo que quieres hacer): Queremos una pagina que muestre una tabla con filas de
valores y que el usuario pueda eliminar las filas que quiera.

1º Creamos el caso mas sencillo en HTML

<html>
<head><title>Prueba eliminar</title></head>
<body>
<form action="xec.php" method="GET">
  <table>
    <tr><td><input type="checkbox" name="delete" value="identify"> </td><td>Una valor</td><td>Otro Valor</td></tr>
    <tr><td><input type="checkbox" name="delete" value="identify2"> </td><td>Una valor</td><td>Otro Valor</td></tr>
    <tr><td><input type="checkbox" name="delete" value="identify3"> </td><td>Una valor</td><td>Otro Valor</td></tr>
   <tr><td><input type="submit" name="borrar" value="Borrar"/></td></tr>
  </table>
</form>
</body></html>


Ahora creamos en php el codigo que recibe los parametros este codigo no deberia
cambiar, da igual que le enviemos los datos por un formulario en html o por ajax.

<?php

  
/*Aqui verifica desde que pagina recibes los datos, tambien puedes guardar la ip 
fecha y hora, vamos hacer un log con ip, hora y datos pasados por si ocurre una 
intrusion saber quien la hizo y lo mas importante como. Aqui tambien deberias 
comprobar si tienes distincion de usuario que usuario envio los datos y si tiene 
permisos para poder realizar esta operacion, pero supongo que aun no as llegado 
a este punto en tu aprendizaje, el uso de grupos, usuarios y permisos*/


  
foreach( $_GET["delete"] as $id)
 {
   
borrar($id);
 }

   function 
borrar($id)
  {
      
/*Ahora tendremos que hacer varias pruebas para evitar ataque sql y xss*/ 
      /* 1º Si el identificador fuera un numero lo tendriamos facil */
      
if ( is_numeric($id) ) 
      { 
           
/*y lo insertamos normalmente en la base de datos sin mas complicacion
            pero recuerda que si pasas un identificador numero antes de hacer una   
            consulta, insercion, modificacion o eliminacion a la bd tienes que 
            comprobar si es un digito, porque sino seras vulnerable a un ataque sql */
      
}
      
/*2º Si el identificador no es un numero es un cadena de caracteres la cosa se
       complica un poco para poder evitar ataques sql y xss tienes que transformar 
       la cadena por si acaso*/
      /*Para evitar ataques sql se deben remplazar el caracter " por \" */  
      
$id str_replace('"','\"',$id);
     
/*Con esto es suficiente, y ademas las librerias que se comunican con la bd ya 
        lo suelen hacer ellas misma pero por si acaso.... Tambien puedes buscar 
        palabras reservadas de sql como UNION , INSERT, UPDATE pero no es  
        necesario si no me equivoco, seguro que alguien que sepa inyectar sql   
         avanzado te puede ayudar mas que yo en seguridad. */
    /* Para evitar los ataques xss debes comprobar que la cadena no contenga las  
         etiquetas tipicas de html como input, form... esto se puede hacer con */
   
$id htmlentities($id); /*En realidad esto las anula*/
   /*Si el identificador siendo una cadena tiene alguna mascara por ejemplo que 
        simpre sea una palabra en minusculas que no pueda contener espacios ni 
        numeros ni caracteres especiales puedes sustituir la instruccion anterior por 
        otra mas segura comprobando la cadena creo que no existe funcion para 
        esto.*/
   /* al final insertamos la cadena en la consulta sql y comprobamos si elimina o 
       no algun registro y esto es lo que deberia devolver la pagina*/
  
}
  

?>



Como ves tienes trabajo en lo que es php

Una vez echo el codigo en php solo nos queda volver hacer el html pero esta vez
usando javascript un ejemplo que no e probado pero que es del estilo que tu
quieres:

<html>
<head><title>hola</title>
<script> <!-- Tambien puedes guardar la funcion en un archivo .js y cargarlo--!>
function borrar($id){
//tu codigo para enviar el identificador a la pagina y bueno lo que quieras hacer despues.
}
</script>
</head>
<body>
<table>
<tr><td onclick="borrar(\"Identy1\")"></td><td>Un valor</td><td>OtroValor</td></tr>
<tr><td onclick="borrar(\"Identy2\")"></td><td>Un valor</td><td>OtroValor</td></tr>
<tr><td onclick="borrar(\"Identy3\")"></td><td>Un valor</td><td>OtroValor</td></tr>
</table>
</body></html>


Como ves da igual que el usuario vea como se envia los datos (en realidad
cualquier programador experimentado sabe sacar como se envian los datos ya
sea por ajax o por formularios en html ).

Para responder a tu pregunta inicial de como ocultar ..... no se puede ocultar el
codigo javascript incluso si miras las paginas de los grandes con atencion veras
como estos envian los datos. En realidad que el usuario vea o no el codigo no es
una vulneridad (pues el solo ve el codigo de cliente ). Lo unico vulnerable que
debe preocupar a los programadores se controlan desde php, estos deben
verificar que ninguna dato pasado pueda ser usado para hacer daño al servidor.
Simplificando esta mini explicacion, un programador web solo debe preocuparse
de las vulneridades que puedan afectar al servidor usando para evitarlo el codigo
de servidor elegido ya sea php, asp .....

Saludos, espero que te ayudara aunque me quedo un poco largo.

Hagoromo

Caray! Vaya currazo!
Me ha quedado muy claro, muchísimas gracias por el aporte.
Se merece un chinchetazo, y de los grandes...  :D

LO pruebo este finde y os comento.

Saludos!!!