domingo, 19 de septiembre de 2010

Comunicacion Java y PHP mediante JSON

Hace poco me surgió la necesidad de tener que comunicar una aplicacion Java (cliente) con PHP (servidor) el cual enviaría datos obtenidos de base de datos a la capa cliente de Java.La solución que encontramos fue la siguiente: usando datos en formato JSON y ayudandonos de la librería URLConnection de Java.

A continuación veremos un ejemplo sencillo de como realizar esta comunicación.
En primer lugar preparamos los datos que vamos a enviar y los convertimos a formato JSON mediante la librería Gson de Google:

Map <String,String> datosEnv=new HashMap<String,String>();
datosEnv.put("nombre", "pepe");
datosEnv.put("apellido","Gonzalez");

//Creamos la cadena con los datos en formato JSON 
Gson gson = new Gson();
String jsonOutput = gson.toJson(datosEnv);

A continuación estableceremos conexion con el servidor y le enviaremos los datos por Post y recibiremos la respuesta por parte del servidor:

try{
          //Usamos URLencode para poder enviar la cadena
          jsonOutput = URLEncoder.encode("key", "UTF-8") + "=" + URLEncoder.encode(jsonOutput, "UTF-8");
          //Establecemos la conexion y enviamos los datos
          URL url=new URL("http://localhost/serv/index.php");
          URLConnection con = (URLConnection) url.openConnection();
          con.setDoOutput(true);
          OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
          wr.write(jsonOutput);
          wr.flush();
          //Recibimos los datos
          BufferedReader recv = new BufferedReader(new InputStreamReader(con.getInputStream()));
          //Los mostramos por pantalla
          String s=recv.readLine();
          while(s!=null){
                  System.out.println(s);
                  s=recv.readLine();
                }
       }catch (Exception e){
           System.out.println(e.getMessage());
       }

Bien ya tenemos listo el código de la parte cliente , ahora veamos como tratamos los datos en el servidor y generamos una respuesta.Para ello debemos tener el siguiente código en el archivo index.php

<?php
    //Decodificamos los datos
    $se=json_decode(stripslashes($_POST["key"]));
    //Mostramos los datos
    echo"Soy el servidor , te envio los siguientes datos:\n";
    echo "Nombre: ".$se->nombre."\n";
    echo "Apellido: ".$se->apellido."\n";

?>


Destacar que en la parte servidor todo lo que genere código para ser visualizado será enviado a la parte cliente.En este caso la parte cliente recibirá lo siguiente:

Soy el servidor , te envio los siguientes datos:
Nombre: pepe
Apellido: Gonzalez

Aquí tenéis el código completo de la parte cliente para que podáis probarlo:

import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Lakatos
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        estableceComunicacion();
    }

    private static void estableceComunicacion() {
        Map <String,String> datosEnv=new HashMap<String,String>();
        datosEnv.put("nombre","pepe");
        datosEnv.put("apellido","Gonzalez");       
        Gson gson = new Gson();
        String jsonOutput = gson.toJson(datosEnv);      
       try{
          //Usamos URLencode para poder enviar la cadena
          jsonOutput = URLEncoder.encode("key", "UTF-8") + "=" + URLEncoder.encode(jsonOutput, "UTF-8");
          //Establecemos la conexion y enviamos los datos
          URL url=new URL("http://localhost/serv/index.php");
          URLConnection con = (URLConnection) url.openConnection();
          con.setDoOutput(true);
          OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
          wr.write(jsonOutput);
          wr.flush();
          //Recibimos los datos
          BufferedReader recv = new BufferedReader(new InputStreamReader(con.getInputStream()));
          //Los mostramos por pantalla
          String s=recv.readLine();
          while(s!=null){
                  System.out.println(s);
                  s=recv.readLine();
                }
       }catch (Exception e){
           System.out.println(e.getMessage());
       }

    }

}
Espero que os sirva de ayuda.
Un saludo.

lunes, 30 de agosto de 2010

Introducción a prevenir XSS con PHP

Después de una entrevista de trabajo en la cual me preguntaron si tenia conocimientos de XSS me decidí a investigar y aprender más sobre seguridad en la web , y la verdad que he descubierto un mundo de nuevo que aprender.
XSS (Cross Site Scripting) es una de las vulnerabilidades más comunes , existen varios tipos como indirecto , directo, usando AJAX..Aunque hoy nos centraremos en el XSS directo.
El XSS directo consiste en  inyectar código  indeseable ,habitualmente Javascript o VBScript , en formularios mal validados o con ciertos agujeros de seguridad.Un ejemplo típico de este tipo de ataques es el siguiente:

<script>window.location = "http://www.google.com";</script>

Si alguien introduce esto como comentario en nuestro blog y no esta correctamente validado ,al mostrarlo veríamos que nuestra página se redirige automáticamente a la url que quiera el atacante.

Cómo prevenirlo con PHP

Después de haber visto el ejemplo anterior nos deberíamos dar cuenta que toda información recibida debe ser limpiada y validada .PHP nos puede ayudar en esta tarea .La forma más básica es usando la función strip_tags ,la cual nos devuelve la cadena de entrada una vez eliminadas las etiquetas html  veamos un ejemplo:

strip_tags('<script>alert("vulnerable");</script>');
//Obtendríamos: alert("vulnerable");

El uso de esta funcíon es hasta cierto punto efectivo , pero tiene algunos problemas o límites:
  • Podemos incluir como segundo parámetro las etiquetas html que deseamos que no sean eliminadas.Esto puede traernos algún problema (como indica la documentacion de PHP),strip_tags no elimina el código html incluido en los atributos de las etiquetas que permitimos , por ejemplo:  
           <b onmouseover=”<script>alert(’XSS’)</script>”>text</b>
    • Por sí sola no puede evitar ataques con códigos más elaborados.

    Otra forma mas elaborada de prevenir ataques de este tipo es permitir usar un pseudocódigo (por ejemplo BBCODE) en cual es posteriormente reemplazado por etiquetas html verdaderas, por ejemplo si permite la cadena:

    [b]Negrita[/b]

    Podemos usar el siguiente script para transformar el BBCode por etiquetas html:

    <?php
    $texto=strip_tags($texto);
    $texto=str_replace(’[b]’,’<b>’);
    $texto=str_replace(’[/b]’,’</b>’);
    ?>

      miércoles, 11 de agosto de 2010

      Saludos y bienvenidos

      Bienvenidos a mi blog , en donde publicaré todo tipo de noticias y sobre los temas que me interesan (ciencia , desarrollo web , curiosidades..) e intentaré aportar con mis pequeños conocimientos y avances en el mundo del desarrollo web.
      Espero que disfruteis de él  tanto como yo.