SSH reverse Tunnel en Iphone o Ipad sin Jailbreak

image

Ya había hablado anteriormente de como hacer un ssh Reverse Tunnel y para que sirve pero resulta que en el trabajo empezaron a bloquear acceso a diferentes aplicaciones o paginas que uso para no volverme loco ahí, una de ellas por ejemplo, Apple Music así que decidí darme a la tarea de intentar hacer funcionar un tunnel en mi iphone que no tiene Jailbreak y la verdad resultó mucho más fácil de lo que creí, aquí les dejo como hacerlo por si ocupan.

NOTA: No me voy a detener a explicar como preparar el servidor SSH por que eso ya lo hice AQUÍ así que asumiré que ya hicieron esa parte y me iré directo a la parte del cliente

1.- Primero que nada, necesitamos una terminal que nos permita conectarnos por ssh a nuestro servidor, encontré varias pero la que más me gustó fue vSSH que tiene versión de pago y la versión Lite, que para este caso, me funcionó perfectamente bien, esta aplicación me gustó y decidí dejarla porque entre otras cosas nos ahorra la parte de configurar a mano el port forwarding.

image

2.- Creamos una nueva conexión donde pondremos los datos de nuestro servidor.

image

3.- Agregamos el port forwarding, seleccionando “Dynamic SOCKS proxying” con esto abriremos una conexión SOCKS hacia nuestro servidor.

image

4.- Ahora tenemos que configurar la conexión de nuestro Iphone o Ipad para que se conecte a nuestro servidor usando un servidor SOCKS, lamentablemente eso no es posible, sin embargo hay manera de darle la vuelta y es configurando nuestra conexión para que use un script proxy, este script tiene que estar en internet y debe de estar en un lugar que pueda ser accesible desde nuestro teléfono, este script es bastante simple y debe de tener la terminación .pac

Ya que tenemos el script lo agregamos a nuestra conexión, desde “Configuración => Wi-Fi => “signo de admiración” => Proxy HTTP

image

5.- Ahora solo resta iniciar desde vSSH nuestra conexión y listo!! ya estamos dirigiendo todo el tráfico a nuestro Tunnel.

EXTRA: un problema que tiene esta solución, es la manera en que IOS administra el “multi task” ya que si tienes periodos muy largos de inactividad IOS cierra la app vSSH y nos deja sin tunnel, por lo que tendríamos que iniciarla de nuevo.

Ahora, si tienes Jailbreak eso lo solucionas con cualquier tweak de multitask, yo en lo personal uso la opción Aura del tweak  Multiplexer que pueden encontrar en la repo de BigBoss

image

Espero esto les sirva.

Login Form con PHP

Este es un script para un formulario de login y registro que usa una base de datos SQLite en lo personal me gusta mucho, ya que no necesita instalación, la configuración es sencilla y todo viene en una solo archivo PHP. El script necesita mejoras, como poder usar MySQL, los formularios están en un formato muy básico, listos para que los adapten fácilmente a los temas de sus proyectos.

Por favor, si lo usan y lo anastomizan, haganmelo saber

El script consta de 2 archivos, uno para los formularios, que en esencia es el que realiza todo el flujo y otro que es un script para crear la base de datos.

index.php

_instalar.php

Espero les sirva y lo usen y obvio regresen a comentar.

Detectar el Navegador con PHP

image

En un proyecto que estoy realizando actualmente me topé con la sorpresa de que aún hay gente salvaje que usa Internet explorer!!! incluso usan la versión 6!! por lo tanto, me vi en la penosa necesidad de detectar que navegador usan y dependiendo de eso aplicar un script.

El código para detectar el tipo de navegador, es muy simple y es el siguiente:

Ahora, en mi caso, también necesité crear un script para correr un código dependiendo del navegador

Este código se manda llamar con getbrowser()

Espero les sea de utilidad, nos leemos luego

Usando Sesiones en PHP

$_SESSION es un array especial que se utiliza para almacenar información a través de los pedidos de páginas que realiza un usuario durante su visita a nuestra página o aplicación web. Mientras que la aplicación no se cierre, si existe un valor dentro de la sesión, el mismo persistirá entre las páginas que visite el usuario.

Aunque puede haber muchos usuarios en nuestra página al mismo tiempo, cada uno posee su propia sesión; esto se logra ya que PHP otorga a cada sesión un ID único que permite que cada visitante pueda acceder únicamente a la sesión que le fue asignada.
Los valores de sesión se almacenan en el servidor, en vez de la computadora del usuario, lo cual hace que esos datos sean más seguros que los que podemos obtener de una cookie por ejemplo.

Hay que tener en cuenta que las variables se sesión se encuentran en casi todos los lenguajes actuales, por lo que todo lo que leeran en este post puede ser usado en cualquier otro lenguaje, no solo PHP

Usando sesiones

image

Antes de poder almacenar datos en la sesión, es necesario inicializar el manejo de sesiones. Esto se realiza al comienzo del código PHP y debe ser declarado antes que cualquier texto, código HTML o JavaScript. Para inicializar la sesión se llama a la función session_start().

session_start() inicia la sesión entre el usuario y el servidor y permite que los valores que sean almacenados estén accesibles en próximos scripts. Por ejemplo, en el siguiente código, vamos a obtener el valor que fue guardado en la sesión, con la clave “usuario”.

Este es un ejemplo muy básico que demuestra cómo almacenar y obtener los valores de la sesión. Creamos una clave en el arreglo de sesión y luego podemos acceder al valor que hemos almacenado allí. Todo esto se podrá lograr, mientras la sesión del usuario permanezca activa.

Finalizando una sesión

Tan importante como inicializar una sesión, es terminarla. Incluso teniendo en cuenta que la sesión es una forma de almacenar datos de manera temporal, es muy importante limpiar los datos de sesión para maximizar la seguridad (sobre todo cuando se trabaja con datos sensibles). También es importante tener en cuenta que el limpiar una sesión alivia la carga en el servidor.
Para limpiar un dato de una sesión se utiliza la función unset().

También es posible eliminar todos los datos de la sesión al mismo tiempo, utilizando la función session_unset()

Ambas funciones afectan a los datos de sesión, pero no a la sesión misma. La sesión sigue abierta y podemos agregarle nuevos datos a ella. Si lo que queremos es cerrar definitivamente una sesión (cuando por ejemplo, un usuario hace “log off”), tenemos que usar la función session_destroy().

Es altamente recomendable destruir la sesión cuando sabemos que la misma no va a ser utilizada más, en lugar de limpiar los datos con session_unset(). Si sólo eliminamos los datos, la sesión permanece activa y código malicioso podría inyectarle datos a la misma.

Seguridad

A pesar de lo simples que son las sesiones, existen formas de utilizarlas que nos pueden traer problemas. Vamos a ver unos ejemplos de como evitarlos:

Time-outs

Los time-outs (o tiempos de espera) son muy importantes si tus usuarios se autentican en tu aplicación. Por ejemplo, un usuario inicia sesión en una computadora pública (un ciber café) y luego se va sin cerrar la sesión. ¿Cómo hacer para que el próximo usuario de esa computadora no acceda a la cuenta del usuario anterior?
Para resolver el problema, podemos utilizar el siguiente código:

El código verifica que si no hubo actividad por más de 600 segundos (10 minutos), el pedido se redireccione a la página logout.php.

Regenerar el ID de sesión

La función session_regenerate_id() crea un nuevo ID único para la sesión del usuario actual. Esto se utiliza cuando ocurren acciones importantes de autenticación (como el inicio de sesión o la modificación de datos del usuario). Indicar un nuevo ID de la sesión hace a la aplicación más segura, reduciendo el riesgo de ataques llamados “Session Hijacking”.

Utilizar un almacenamiento permanente

Las sesiones son un almacenamiento temporal, se pueden cerrar y al hacerlo los datos se pierden. Es necesario, utilizar bases de datos, para todo lo que sabemos que vamos a necesitar más adelante.

Usar el API de Facebook en PHP

Ese fin de semana he tenido que dedicar un buen rato a lidiar con los caprichos de la API de Facebook, una API que a mi gusto tiene la peor documentación jamás vista. Por eso, y para que ustedes no sufran lo que he sufrido yo les dejo una pequeña explicación de cómo lo he hecho yo. seguramente como siempre pasa existen muchas maneras de hacer esto, pero esta es la que a mi me funcionó.

Lo primero que necesitaremos, evidentemente, es la API oficial de Facebook, que podemos descargar desde GitHub. Descomprimimos el archivo y lo subimos a nuestro servidor.

También necesitamos crear una aplicación en facebook, que será la encargada de llevar a cabo estas operaciones sobre nuestro perfil de usuario o pagina comercial. Para ello hay que dirigirnos al sitio web de desarrolladores de Facebook, donde tendremos que validar nuestra  cuenta,ya sea introduciendo nuestro numero celular para que nos  envíen un código de confirmación, o bien introduciendo nuestro número de cuenta. En serio, es escalofriante, pero ya sabemos todos como es Facebook.

Una vez que creemos la aplicación podremos consultar el id de la aplicación y la clave secreta de aplicación en esa misma página. Estos son dos de los datos que vamos a necesitar, así que hay que tenerlos a mano.

Lo siguiente que necesitamos es que nuestro usuario dé permisos a nuestra aplicación para poder interactuar con nuestra cuenta. Esto lo podemos hacer de forma sencilla utilizando una URL especialmente diseñada a tal efecto, que tendrá el siguiente aspecto:

https://graph.facebook.com/oauth/authorize?type=user_agent&
client_id=ID_APLICACION&
redirect_uri=http://www.facebook.com/connect/login_success.html&
scope=offline_access,manage_pages,publish_stream,create_event

donde:

  • client_id es el id de la aplicación, que habíamos apuntado en el paso anterior
  • redirect_uri es la página a la que vamos a redireccionar el navegador una vez hayamos dado los permisos a la aplicación
  • y scope es una lista de permisos, cuyos posibles valores podemos consultar en la documentación al respecto. El permiso offline_access es uno de los más importantes: permite que el token que nos va a pasar Facebook para autenticarnos no caduque, incluso cuando el usuario esté desconectado. Si quieres interactuar con las páginas que gestiona tu usuario, en lugar, o además de con tu propia cuenta personal, necesitarás requerir también el permiso manage_pages
image

Al cargar la URL en tu navegador y pulsar ‘Permitir’, si no ha pasado nada raro, Facebook debería redirigirte a la página que indicaste como valor de redirect_uri, añadiendo a esta un parámetro access_token, que es el que utilizaremos para identificarnos, y otro expires_in, que nos informa de que el token de acceso no va a caducar.

Para comprobar que todo funciona correctamente puedes intentar cargar la siguiente URL:

https://graph.facebook.com/me?access_token=ACCESS_TOKEN

Si el token de acceso es el adecuado, Facebook nos mostrará un objeto JSON con la información de nuestra cuenta de usuario. En caso contrario, mostrará un objeto JSON informando del error.

Ahora bien, si queremos interactuar con las páginas  que administremos, en lugar de con nuestra página personal, necesitaremos un access token distinto. Para obtenerlo preguntaremos a Facebook por la información de las distintas páginas y aplicaciones que administramos utilizando la URL:

https://graph.facebook.com/me/accounts?access_token=ACCESS_TOKEN

Listo. Ahora sí, ya estamos preparados para empezar a jugar con la API de Facebook. Para publicar en el muro, crear eventos y subir imágenes en Facebook utilizaremos la clase del mismo nombre, a cuyo constructor le pasamos un array con el identificador de nuestra aplicación y su contraseña:

El método que nos interesa de esta clase es api, que normalmente tendrá como primer parámetro una cadena del tipo "/ID_USUARIO/SERVICIO" o "/ID_PAGINA/SERVICIO". El segundo parámetro es siempre el método a utilizar (POST o GET), y el tercero, un array con los argumentos necesarios para ese servicio.

Para publicar algo en el muro, por ejemplo, utilizaríamos como primer parámetro una cadena "/ID_USUARIO/feed" y como tercer parámetro, un array con claves message (el mensaje a publicar) y access_token, siendo este último el valor que obtuvimos anteriormente para identificar a nuestro usuario o alguna de las páginas de marca que administramos (OJO: el token de acceso del usuario no sirve para identificar a la página y viceversa).

Para terminar, les dejo una pequeña clase que les permitirá escribir en el muro, subir una foto o crear un evento.

Listo!!

Proyecto: Cotizador en PHP

Aquí un proyecto que me encargaron de un cotizador en PHP.

Lo que me pidieron es poder cotizar en linea cuando no están en la empresa y necesitan mandar por email una cotización express.

Por el momento no guarda la información de los productos en una base de datos, pero si lee la información de los clientes de una, si es que se tiene, si no, puede ingresarse de forma manual al instante, lo más importante es que es funcional y cumple con lo que me pidieron.

Primero creamos un archivo cotiza.php donde vamos a insertar los datos del cliente, productos, cantidad y precio.

Despues creamos el archivo ver.php, que es donde vamos a ver la cotización ya con subtotal. total, iva y todo

Este es el resultado:

image

image

Espero les sirva algún día

Conectar PHP con Oracle

Últimamente he estado trabajando en un proyecto en el cual es necesario que sea escalable en cuanto a la conexión a base de datos Hablo de escalabilidad ya que la aplicación debe de conectarse con MySQL y Oracle mediante PHP, con la primer Database no hay problema ya que PHP trabaja bastante bien con MySQL, pero con Oracle si había que habilitar cierta extensión para poder trabajar, ó instalar una aplicación la cual tenia la extensión necesaria. 

Lo primero que tenemos que hacer es comprobar si existe alguna extensión oci8, para eso buscamos esta cadena en el phpinfo():

extension oci8

Si encontramos alguna cadena después de la cadena oci8, como en la anterior imagen, solo bastara con modificar una linea en el php.ini y reiniciar el servidor.

Para modificar el archivo iremos a la ubicación donde se encuentra, en este caso es c:xamppphp pero esto varía dependiendo del OS y de el paquete xampp, editaremos con nuestra aplicación favorita para tal fin:

phpini

Una vez abierto el archivo buscaremos la siguiente linea y eliminamos el ” ; ” asi descomentando:

1
extension=php_oci8_11g.dll

oci8 oracle 11g

Solo nos queda reiniciar el servicio del Servidor Apache, así que paramos e iniciamos el servidor para que tome los cambios. Ojo, esto es importante!

reiniciar apache

Ahora si la versión que tengamos no tenga este soporte nativo para Oracle? Googleando encontré una solución para este problema.

Ahora veamos si nos funciona, crearemos una carpeta en nuestro servidor local, a nuestro gusto, y en ella el archivo que hará la conexión con el Servidor Oracle:

La linea 3 es la encargada de la conexion, esta consta del nombre de usuario, la contraseña, y host de Oracle. Recordemos que el host se puede manejar tanto por IP como por el nombre de la maquina.

Bueno, para finalizar, si todo sale bien podremos ver el siguiente resultado cuando abramos el archivo por el navegador web:

conexion php con oracle

Script que revisa si un archivo fue modificado y envía el resultado por e-mail

Pues resulta que en el trabajo me encargaron hace un tiempo un script que buscara si los archivos dentro de una carpeta fueron modificados  en un rango de tiempo y que enviara el resultado de esta búsqueda por email, el script es muy simple y espero que a alguien le sirva de algo.