jueves, 16 de abril de 2015

Proteger tu IP de Skype Resolvers

Buenas tenia rato sin crear una nueva entrada, aunque esto ya es algo viejo todavia lo siguen usando mucho... Asi que les traigo un TIP muy basico para que se protegan la IP de los resolvedores de IP de skype:

https://mostwantedhf.info/index.php (Este es un ejemplo de un Resolver IP Skype)




Desde ahi podemos seguir buscando informacion:


Ahora la configuracion es facil, nos dirigimos a skype>Herramientas>Opciones o simplemente ctrl+,
Nos dirigimos a Avanzada>Conexion y configuramos todo como la siguiente imagen muestra:

 
Listo Ahora guardamos los cambios y cerramos y abrimos skype de nuevo. Con esto protegemos nuestra IP, se que es algo basico y algunos ya lo sabian pero les puede ser util a mas de alguno, saludos!



miércoles, 8 de abril de 2015

[Arthusu] Mi metodologia pruebas de penetracion

Introduccion

Bienvenidos a este tutorial, si es que le podemos llamar de esa forma, ultimamente he estado publicando algo, entonces se me ocurrio que a ustedes les serviria un poco este tipo de tutorial ya que he buscado mucha informacion en la red y he recogido lo que me parece mas importante que pueden utilizar para este tipo de cosas.

Antes que nada decirles que hay un proyecto muy conocido de documentacion sobre vulnerabilidades web llamado OWASP el cual contiene una guia muy buena en la cual pueden aprender demasiado sobre este tipo de metodologia.


Esta imagen la he encontrado en google y como dicen que una imagen vale mas que mil palabras, pues aqui les dejo las fases para el proceso de analisis.


1.- Preparacion y Planeamiento

Lo primero es intentar obtener la mayor informacion sobre el objetivo a analizar.

En este caso tendre en mi objetivo: animextremist.com

Es una pagina la cual visito continuamente, bueno veremos como hacer poco a poco, este tipo de prueba, claro yo lo hare a mi manera, ya que otros pueden utilizar otro tipo de herramientas o solo utilizar este concepto de manera que les pueda 'servir'.

http://whois.domaintools.com/ <- Esta es una herramienta muy util para mi me da mucha informacion sobre el dominio, en su version de paga es mucho mas util.

Con la informacion recogida se los datos siguientes:

80.82.78.206 esta alojado en un servidor dedicado de godaddy.com
El email del admin es juanelo512@hotmail.com
Su nombre es Juan Celis Garcia
Su calle: Peralvillo 22 edificio c-301
Su colonia: Colonia Morelos
Su ciudad: Mexico City
Su pais: Mexico
Su codigo postal: City 06200
Su telefono: 55269882

Informacion sobre el servidor: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 
Usaba Cloudflare

PHP_VERSION 5.4.36
Dominio asociado: http://myanx.com/

Gracias al uso de las redes sociales hoy en dia podemos sacar mucha informacion, por ejemplo usando Facebook, coloco el correo que encontre anteriormente:

juanelo512@hotmail.com y encuentro esto:
https://www.facebook.com/animextremist.anx

Ok, tiene su correo con su cuenta de animextremist pero veo que tiene 2 amigos, dentro de esos dos amigos busco a Juan Celis! :P

https://www.facebook.com/juan.celis.904

He aqui Juan Celis Administrador de AnimeXtremist Mi idolo :) 

Encontrando mas informacion:

Su hermana: https://www.facebook.com/cicky.celis

Ahora podemos buscar sobre el en google utilizando Su nombre y donde estudio, ejemplo: Juan celis Unitec, esa informacion la saque desde facebook.

https://twitter.com/Seiji_Ibiki


Con esto concluimos que el uso de las redes sociales para obtener informacion es de demasiada ayuda, algunas redes sociales pueden ser:

* Twitter
* LinkedIn
* Google+
* Instagram
* Facebook

Tambien si este fuera un servidor compartido, podriamos hacer uso de BING para buscar algunos de lso dominios compartidos, ejemplo:

IP: xxx.xxx.xxx.xxx

Aqui no se acaba, podemos intentar recopilar informacion de subdominios, utilizando Google.

site: elsitio.com -site:elsitio.com

http://ftp.animextremist.com

Tambien en este ejemplo con Shodan hemos encontrado su panel de cPanel:

https://80.82.78.206:2087
https://80.82.78.206:2083
https://80.82.78.206:2096
https://80.82.78.206:2078/


ftp://80.82.78.206/

Otra manera de buscar informacion con google es utilizando sus keywords, por ejemplo:

site:animextremist.com filetype:txt

Siguiendo con las keywords de google pues como hay bastantes formas utiles solo hay que jugar con ellas, de todas maneras si puedo pronto hare algun tutorial sobre Google Hacking :P

http://www.animextremist.com/noticias/noti543.php?subaction=showfull

http://animextremist.com/mangas-online/the-breaker-new-wave/capitulo-3/

http://www.animextremist.com/series/dbzpelis_archivos/

http://www.animextremist.com/fansub/
?subaction=showcomments
&id=1195023652
&archive=
&start_from=
&ucat=3
&


http://www.animextremist.com/fansub/noticias/data/
http://animextremist.com/cgi-sys/scgiwrap

Algunos errores:


site:animextremist.com intext:"seijixt"


Warning: include(../comentarios/show_news.php): failed to open stream: No such file or directory in /home/seijixt/public_html/noticias/noti543.php on line 401

Warning: include(): Failed opening '../comentarios/show_news.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/seijixt/public_html/noticias/noti543.php on line 401

Warning: include(../comentarios/show_news.php): failed to open stream: No such file or directory in /home/seijixt/public_html/noticias/noti543.php on line 404

Warning: include(): Failed opening '../comentarios/show_news.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/seijixt/public_html/noticias/noti543.php on line 404


2004.12.08 19:46 B D:\Juan\Animextremist\animextremist\series\dbzpelis_archivos\dbzpeli1.jpg --> 65.110.45.90 /public_html/series/dbzpelis_archivos dbzpeli1.jpg

2004.12.08 19:46 B D:\Juan\Animextremist\animextremist\series\dbzpelis_archivos\dbzpeli2.jpg --> 65.110.45.90 /public_html/series/dbzpelis_archivos dbzpeli2.jpg

2004.12.08 19:46 B D:\Juan\Animextremist\animextremist\series\dbzpelis_archivos\dbzpeli3.jpg --> 65.110.45.90 /public_html/series/dbzpelis_archivos dbzpeli3.jpg

2004.12.08 19:46 B D:\Juan\Animextremist\animextremist\series\dbzpelis_archivos\dbzpeli4.jpg --> 65.110.45.90 /public_html/series/dbzpelis_archivos dbzpeli4.jpg



Con esto tenemos el posible nombre de usuario del cPanel :D
seijixt :P y la ruta :D, hace un tiempo hice un post sobre brute force el cual podriamos intentar, o simplemente intentar acceder con las peores contraseñas

Otra cosa que podemos hacer es usar algun brute forcing de directorios o simplemente hacer un crawler o spider para encontrar mas informacion.

Un ejemplo Yo utilizo ZAP de OWASP o DirBuster para buscar URL's, puntos de entrada, y directorios de la pagina que no son muy accesibles... Burp Suite tambien es una herramienta genial para esto.

Gracias a ZAP encontramos una posible Inyeccion SQL, ademas de un monton de urls y parametros:

http://animextremist.com/dd3.php?ver=H' 
http://www.animextremist.com/mangas.htm?ord=genero&id=18'
SQLI: http://www.animextremist.com/mangas.htm?ord=genero&id=18 and 0 union select version() %23  hola

http://www.animextremist.com/foro/
http://animextremist.com/mangas-online/user/user/


Usa una base de datos MySQL. Cuando obtengamos los datos solo es necesario usar algun Admin Finder Online o una tool que te hayas creado.

http://animextremist.com/login.php
http://www.animextremist.com/pruebas/Admin.html

http://www.animextremist.com/tools/

Lo siguiente es reconocer los servicios que se estan usando. Aqui utilizaremos herramientas como NMAP.

Ejemplo: nmap -sV -T4 -O -Pn 80.82.78.206

Starting Nmap 6.40 ( http://nmap.org ) at 2015-03-22 19:33 Hora estándar Montañas (México)

Nmap scan report for 80.82.78.206

Host is up (0.19s latency).

Not shown: 982 closed ports

PORT     STATE    SERVICE      VERSION

21/tcp   open     ftp          Pure-FTPd

22/tcp   open     ssh          OpenSSH 5.3 (protocol 2.0)

25/tcp   open     smtp         Exim smtpd 4.84

53/tcp   open     domain

80/tcp   open     http         Apache httpd 2.2.29 ((Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4)

110/tcp  open     pop3         Dovecot pop3d

135/tcp  filtered msrpc

139/tcp  filtered netbios-ssn

143/tcp  open     imap         Dovecot imapd

443/tcp  open     ssl/http     Apache httpd 2.2.29 ((Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4)

445/tcp  filtered microsoft-ds

465/tcp  open     ssl/smtp     Exim smtpd 4.84

587/tcp  open     smtp         Exim smtpd 4.84

993/tcp  open     ssl/imap     Dovecot imapd

995/tcp  open     ssl/pop3     Dovecot pop3d

1025/tcp filtered NFS-or-IIS

3306/tcp open     mysql        MySQL (unauthorized)

6129/tcp filtered unknown

Device type: general purpose|firewall|WAP|webcam

Running (JUST GUESSING): Linux 2.6.X|3.X|2.4.X (94%), Check Point Linux 2.6.X (85%), Tandberg embedded (85%), Fortinet Linux 2.6.X (85%)

OS CPE: cpe:/o:linux:linux_kernel:2.6 cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:2.6.18 cpe:/o:linux:linux_kernel:2.4 cpe:/h:tandberg:vcs cpe:/o:fortinet:linux_kernel:2.6

Aggressive OS guesses: Linux 2.6.32 - 2.6.39 (94%), Linux 3.2 - 3.6 (92%), Linux 2.6.32 - 3.0 (92%), Linux 3.4 (91%), Linux 2.6.39 (91%), Linux 2.6.32 (91%), Linux 2.6.32 - 2.6.35 (90%), Linux 3.1.9 (90%), Linux 3.5 (89%), Linux 3.0 - 3.9 (88%)

No exact OS matches for host (test conditions non-ideal).

Network Distance: 26 hops

Service Info: Host: server.animextremist.com



OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .

Nmap done: 1 IP address (1 host up) scanned in 44.42 seconds


Una de las paginas que no mencione aqui para obtener una mayor informacion es ir a archive.org y ver las paginas de antes ya que muchas veces se encuentran todavia disponibles.

XSS: http://www.animextremist.com/profile/chapter.php?resume_id=69&user=Seiji&user_id=6"></title><script>alert(/arthusu/)</script>



2.- Testeo y Evaluacion

Este paso mas que nada es encontrar vulnerabilidades y obtener acceso, para ello podemos ayudarnos de un sin fin de herramientas pero las que mas utilizo son:

* Acunetix (Detectar vulnerabilidades)
* Vega (Escaner de Vulnerabilidades)
* Waf00f (Detectar Firewall)
* Nikto (Detectar vulnerabilidades)
* NMAP (Servicios)
* ZAP (Directorios,Campos de entrada,  DirBuster)
* Burp Suite  (Directorios, Spider)
* Nessus (Detectar Vulnerabilidades)
* Metasploit (Explotar Vulnerabilidades)
* Google (Recolectar informacion)

A mi en lo personal no me gusta muchos utilizar herramientas, no es por que no sean buenas, sino por que muchas veces hacen mucho "ruido" y alertan rapidamente a un firewall o al administrador. Ademas de aveces tardar demasiado.

En el paso anterior encontramos una vulnerabilidad SQLi sin necesidad de usar herramientas.

Pero no hay nada de malo en usar herramientas ya que traen muchas vulnerabilidades que puedes no conocer ya que sea actualizan dia a dia. Y podemos obtener informacion muy interesante de ellas.


Hay otro tipo de ataque que al parecer se presenta mucho en esta pagina que es bruteforce.


Lo siguiente que podemos hacer es buscar exploits para los servicios anteriores usando Google, ejemplo:


OpenSSL/1.0.1e-fips  exploit




3.- Redaccion de Reportes


Esta suele ser la parte mas aburrida ya que tienes que redactar todo lo que hicistes para encontrar vulnerabilidades, ya sea a nivel web o sistema, tienes que redactarlo bonito de una manera que los "clientes" lo entiendan. Para una mejor redaccion puedes utilizar una plantilla e ir ordenando todas las vulnerabilidades encontradas anteriormente en un archivo final entregado al cliente.

Les dejare algunas plantillas utiles para crear su reporte final.


Security_Assessment_Template.doc
V_Scan_Handout_Sample_Report.pdf
App_CA_Security_Assessment_Summary_Template_030408...


Despedida


Hasta aqui termina este pequeño "tutorial", intente no hacerlo largo por que se aburririan. Espero que a mas de uno les sea de utilidad. Le agradesco a Cesar de Alguienenlafisi por ayudarme, y a todas las personas que me han ayudado en este largo camino.





[Parte 6]jQuery

jQuery - Metodos CSS

La libreria jQuery soporta casi todos los selectores incluidos en Cascade Style Sheet (CSS) las especificaciones de la 1 a la 3 como se indica en el sitio de la World Wide Web Consortium. Con el uso de la libreria jQuery puede mejorar sus sitios web sin tener que preocuparse acerca de los navegadores y sus versiones, siempre que los navegadores tengan habilitado javascript. La mayoria de los metodos jQuery CSS no modifican el contenido del objeto y se utilizan para aplicar las propiedades CSS en los elementos DOM.

Aplicar propiedades CSS

Es muy facil aplicar cualquier propiedad CSS utilizando el metodo de jQuery css(propiedadNombre, propiedadValor), aqui esta la sintaxis del metodo:

selector.css(propiedadNombre, propiedadValor);

Aqui puede pasar propiedadNombre como una cadena javascript y en funcion de su valor, propiedadValor podria ser una cadena o un entero.


Ejemplo: 


A continuacion se presenta un ejemplo que añade color de fuente para el segundo elemento de la lista.




<html>
<head>
<title>El ejemplo de jQuery</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").eq(1).css("color","red");
         });
   </script>
</head>
<body>
  <div>
     <ul>
        <li>Elemento 1 de la lista</li>
        <li>Elemento 2 de la lista</li>
        <li>Elemento 3 de la lista</li>
        <li>Elemento 4 de la lista</li>
        <li>Elemento 5 de la lista</li>
        <li>Elemento 6 de la lista</li>
     </ul>
  </div>
</body>
</html>



Aplicar multiples propiedades de CSS


Puede aplicar multiples propiedades CSS utilizando un unico metodo css de jQuery css({clave:valor,clave:valor,clave:valor...}). Puede aplicar tantas propiedades como desee en una sola llamada. Aqui es la sintaxis del metodo:


selector.css({clave:valor,clave:valor,claveN:valorN})




Aqui puede pasar la clave y el valor como se describio anteriormente. Ejemplo: A continuacion se presenta un ejemplo que añade un color de la fuente, asi como el color de fondo al segundo elemento de la lista.


<html>
<head>
<title>El ejemplo de jQuery</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").eq(1).css({"color":"red","background-color":"green"});
         });
   </script>
</head>
<body>
  <div>
     <ul>
        <li>Elemento 1 de la lista</li>
        <li>Elemento 2 de la lista</li>
        <li>Elemento 3 de la lista</li>
        <li>Elemento 4 de la lista</li>
        <li>Elemento 5 de la lista</li>
        <li>Elemento 6 de la lista</li>
     </ul>
  </div>
</body>
</html>



Estableciendo el ancho y alto de un elemento


Los metodos width(val) y height(val) pueden utilizarse para establecer la anchura y altura, respectivamente de cualquier elemento, ejemplo: A continuacion se presenta un ejemplo sencillo que define la anchura del primer elemento de division en la que el resto de los elementos su ancho ha sido establecido por la hoja de estilos css.


<html>
<head>
<title>El ejemplo de jQuery</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("div:first").width(100);
            $("div:first").css("background-color","blue");
         });
   </script>
   <style type="text/css">
      div{
         width: 70px;
         height: 50px;
         float: left;
         margin: 5px;
         background: red;
         cursor: pointer;
      }
   </style>
</head>
<body>
        <div></div>
        <div>d</div>
        <div>d</div>
        <div>d</div>
        <div>d</div>
</body>
</html>



jQuery metodos CSS


Siguiendo la lista de la tabla de abajo de todos los elementos de todos los elementos que pueden utilizar para jugar con las propiedades CSS.
 
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| Metodo                  | Descripcion                                                                                                             |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| css(nombre)             | Devuelve una propiedad de estilo en el primer elemento que coincida.                                                    |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| css(nombre,valor)       | Establece una sola propiedad de estilo a un valor en todos los elementos coincidentes.                                  |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| css(propiedades)        | Establece un objeto clave/valor como propiedades de estilo a todos los elementos coincidentes.                          |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| height(valor)           | Ajusta la altura CSS de cada elemento que coincida.                                                                     |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| height()                | Obtiene el actual computado, pixel, altura del primer elemento coincidente.                                             |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| innerHeight( )          | Obtiene la altura interior (excluye el border e incluye el padding) para el primer elemento que coincide.               |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| innerWidth( )           | Obtiene la anchura interior (excluye el border e incluye el padding) para el primer elemento que coincide.              |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| offset( )               | Obtiene el desplazamiento del primer elemento coincidente actual en pixeles, en relacion con el documento.              |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| offsetParent( )         | Devuelve una coleccion jQuery con el padre posicionado del primer elemento coincidente.                                 |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| outerHeight( [margen] ) | Obtiene la altura exterior (incluye el border y padding por defecto) para el primer elemento coincidente.               |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| outerWidth( [margen] )  | Obtiene el ancho exterior (incluye el border y padding por defecto) para el primer elemento coincidente.                |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| position( )             | Obtiene la posicion superior e izquierda de un elemento con respecto a su offsetParent()                                |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| scrollLeft( valor )     | Cuando un valor es pasado, al desplazarse hacia la izquierda se establece el valor de todos los elementos coincidentes. |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| scrollLeft( )           | Obtiene el desplazamiento izquierdo del primer elemento coincidente.                                                    |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| scrollTop( valor )      | Cuando un valor es pasado, al desplazarse hacia la arriba se establece el valor de todos los elementos coincidentes.    |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| scrollTop( )            | Obtiene el desplazamiento superior del primer elemento coincidente.                                                     |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| width( valor )          | Ajusta el ancho CSS de cada elemento coincidente.                                                                       |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+
| width( )                | Obtiene el actual computado, pixel, ancho del primer elemento coincidente.                                              |
+-------------------------+-------------------------------------------------------------------------------------------------------------------------+


Fuente: http://www.tutorialspoint.com

PHP 5.6 y el operador Splat

Tenemos un par de nuevas caracteristicas que vienen a PHP 5.6 con nombres que suenan mucho menos interesantes de lo que realmente representan "funciones variadicas" suena positivamente academica, y "desempaquetado de argumento" no es exactamente atrayente. Sin embargo ambos utilizan un nuevo operador en PHP que parece una elipsis (tres puntos ...) y que se conoce como operador de splat o el operador de dispersion. 

Funciones variadicas

Esta caracteristica le permite capturar un numero variable de argumentos a una funcion, combinada con argumentos "normales" aprobadas en si lo desea. Es mas facil de ver con un ejemplo:

 <?php
 function concatenate($transform, ...$strings){
  $string = '';
  foreach($strings as $piece){
   $string .= $piece;
  }
  return ($transform($string));
 }

 echo concatenate("strtoupper","I'd ","Like ", 4+2 , " Apples");
?>

La lista de parametros en la declaracion de la funcion tiene el operador ..., que basicamente significa "... y todo lo demas debe ir en $strings" puede pasar 2 o mas argumentos en esta funcion y la segunda y siguientes se añadira en el array $strings, listo para ser utilizado.

Desempaquetar argumentos

Este tiene un nombre menos sexy que las funciones variadicas, y utiliza el mismo operador pero este es el que me hizo describo codigo PHP como "salvaje" - no es algo que sucede a menudo! Me gusta por que ofrece una forma diferente de utilizar las funciones que ya existen por lo que hace pertinente tan pronto como actualizar a 5.6. 
Las funciones variadicas le permite declarar un array como parametros de entrada, y desempaquetar argumentos le permite pasar un array a una funcion que espera parametros distintos en la forma tradicional; son absolutamente complementarias entre si. Para usar esta funcion, simplemente advertir a PHP que necesita para desempaquetar el array en las variables utilizando el operador ... Un ejemplo sencillo podria tener este aspecto:


 <?php
 $email[] = "Hi there";
 $email[] = "Thanks for registering, hope you like it";

 mail("someone@example.com", ...$email);
?>


Puede pasar todos los argumentos en forma de array (consejo pro: array asociativos no funcionan aqui), o simplemente el ultimo, PHP toma su matriz y pasa cada elemento como parametro siguiente a su vez. Creo que esto es bastante ordenado :).


Fuente: http://www.lornajane.net/posts/2014/php-5-6-and-the-splat-operator

domingo, 5 de abril de 2015

[PHP] Creando un convertidor a MP3 rapido y facil

Buenas tenia ya rato sin escribir algo, bueno espero ser rapido y breve, en esta entrada veremos sobre como crear un convertidor MP3 rapido y facil, en este caso estare utilizando windows, ustedes pueden bajarse el FFMPEG desde su pagina oficial para linux o macosx.

Bueno para ser mas breve posible lo que hare sera mostrar el script e ir explicando por pasos.

Esta es la estructura de nuestro proyectin:



 

 <?php
// sin limite de tiempo
set_time_limit(0);
// para que muestre errores
ini_set("display_errors",1);
error_reporting(E_ALL); 
// para que podamos subir archivos pesados 200MB
ini_set('upload_max_filesize', '200M');


// si se envio el formulario
if(isset($_POST["submit"])) {
 // el directorio a donde ira el video o archivo que conviertas en mp3
 $target_dir = "uploads/";
 // aqui se guarda el mp3
 $generador_archivo = "mp3/file_".md5(mt_rand()).".mp3";
 // el nombre del archivo a subir con su directorio a donde ira
 $target_file = $target_dir . basename($_FILES["file"]["name"]);

 // movemos el archivo
    if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
     // Aqui esta la magia! convertimos el archivo (Cuidado con la ejecucion de comandos XD)
     exec("ffmpeg -i \"$target_file\" $generador_archivo",$output,$return);
     // debug
     //print_r($output);
     // Si se ejecuto correctamente mostramos el enlace al archivo sino un error
     if(!$return){
         echo "<a href=\"mp3/". basename($generador_archivo). "\">Bajar Archivo</a>.";
        }else{
         echo "ERROR";
        }
    // si no se pudo mover el archivo ocurrio un error al subir
    } else {
        echo "Ocurrio un error al subir archivos";
        // debug
        //print_r($_FILES);
    }
}
?>
<!DOCTYPE html>
<html>
<body>

<form action="" method="post" enctype="multipart/form-data">
    Selecciona el archivo a convertir:
    <p><input type="file" name="file" id="file"></p>
    <p><input type="submit" value="Subir Archivo" name="submit"></p>
</form>

</body>
</html> 


Antes de comenzar a explicar el script, les dire que no es nada "seguro", ya que no le agregue seguridad para que se vea lo mas simple posible, pero si ustedes gustan pueden modificarlo. Y otra cosa es que para poder subir este script a un servidor tenemos que buscar que soporte FFMPEG o simplemente tener un servidor dedicado.
Aunque viene todo comentado, explicare...


1.- Le damos un set_time_limit(0) para que se ejecute el script hasta que termine. Mostramos errores con error_reporting y con ini_set establecemos la directiva de PHP.ini para mostrar errores. Establecemos upload_max_filesize en 200M para subir archivos pesados, muchas de las veces las directivas de PHP no te permiten solo con ini_set por lo que tendras que modificarlo desde el archivo de configuracion php.ini.

2.- Comprobamos si existe el formulario con isset($_POST['submit']), asignamos unas variables para la ruta, con md5(mt_rand()) genero un md5 aleatorio para que el archivo mp3 no se repita el nombre.

3.- movemos el archivo con move_uploaded_file a la ruta que asignamos.

4.- El comando mas importante es el comando de sistema exec, el cual realiza la conversion con el programa FFMPEG. La sintaxis es la siguiente:

ffmpeg.exe -i elarchivoaconvertir.mp4 elarchivodesalida.mp3

5.- Por ultimo verificamos que no haya retornado errores y mostramos el enlace en caso contrario mostramos un mensaje de error.
Con los print_r() podemos debuggear las matrices en caso de error.

Ya que nunca pongo imagenes pondre algunas, ya que dicen que "una imagen vale mas que mil palabras", yo les pondre 3 xD...




 

 Listo. Espero que esta entrada les haya sido de utilidad.

domingo, 22 de marzo de 2015

Basic jQuery Slider

Ultimamente he estado viendo demasiadas librerias, y he estado viendo un poco su utilizacion, esta libreria llamada Basic jQuery Slider, es una libreria muy simple de usar y personalizar, de manera que puede ser usada en nuestros proyectos sin mayor problema, ademas es totalmente compatible con HTML5 BoilerPlate y Bootstrap que he presentado anteriormente en el BLOG.



Les dejo su enlace a la descarga:

http://www.basic-slider.com/


Es muy facil de usar como dije, ademas en su descarga contiene archivos de ejemplo para su mejor compresion.

martes, 17 de marzo de 2015

[Parte 5]jQuery

jQuery - desplazandose en el DOM

jQuery es una herramienta de muy gran alcance la cual proporciona una gran variedad de metodos para desplazarse en el DOM para ayudarnos a seleccionar elementos del documento al azar asi como en metodo secuencial. La mayor parte de los metodos de desplazamiento del DOM no modifican el objeto jQuery y ellos se utilizan para filtrar los elementos a partir de un documento basado en condiciones dadas.

Buscando elementos por indice

Considere la posibilidad de un simple documento con el siguiente contenido HTML:

<html>
<head>
   <title>Titulo</title>
</head>
<body>
    <div>
      <li>Elemento de la lista 1</li>
      <li>Elemento de la lista 2</li>
      <li>Elemento de la lista 3</li>
      <li>Elemento de la lista 4</li>
      <li>Elemento de la lista 5</li>
      <li>Elemento de la lista 6</li>
    </div>
</body>
</html>



* Cada lista tiene su propio indice y se puede localizar utilizando directamente el metodo eq(indice) del siguiente ejemplo. Cada elemento hijo comienza su indice desde 0, por lo tanto la lista del elemento 2 se accede mediante el uso de $("li").eq(1) y asi sucesivamente. Ejemplo: 
A continuacion se presenta un ejemplo sencillo que añade color al tercer elemento de la lista:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").eq(2).addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <li>Elemento de la lista 1</li>
      <li>Elemento de la lista 2</li>
      <li>Elemento de la lista 3</li>
      <li>Elemento de la lista 4</li>
      <li>Elemento de la lista 5</li>
      <li>Elemento de la lista 6</li>
   </div>
</body>
</html>


Filtrado de elementos

El metodo filter(selector) se puede utilizar para filtrar todos los elementos del conjunto que coincidan con el selector especificado. El selector puede ser escrito utilizando cualquier sintaxis del selector. Ejemplo:
A continuacion se presenta un ejemplo sencillo que aplica color a las listas con la clase .media:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").filter(".media").addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <li class="arriba">Elemento de la lista 1</li>
      <li class="arriba">Elemento de la lista 2</li>
      <li class="media">Elemento de la lista 3</li>
      <li class="media">Elemento de la lista 4</li>
      <li class="abajo">Elemento de la lista 5</li>
      <li class="abajo">Elemento de la lista 6</li>
   </div>
</body>
</html>


Localizacion de elementos descendientes

El metodo find(selector) se puede utilizar para localizar todos los elementos descendientes de un tipo en particular de elementos. El selector puede ser escrito utilizando cualquier sintaxis de selector. Ejemplo:
A continuacion se presenta un ejemplo que selecciona todos los elementos <span> disponibles dentro de los diferentes elementos <p>:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("p").find("span").addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <p>Este es el 1er parrafo y <span>ESTO ES ROJO</span></p>
      <p>Este es el 2do parrafo y <span>ESTO TAMBIEN ES ROJO</span></p>
   </div>
</body>
</html>


jQuery metodos de desplazamiento

La siguiente tabla enumera abajo metodos utiles que se pueden utilizar para filtrar los diversos elementos de una lista de elementos DOM:


+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selector             | Descripcion                                                                                                                                                                                                                                                                         |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| add(Selector)        | Añade mas elementos, que coincidan con el selector dado, al conjunto de elementos que ya coinciden. Ejemplo: $(".top").add(".middle").addClass("selected");                                                                                                                         |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| andSelf()            | Añade la seleccion anterior a la seleccion actual. Ejemplo: $("div").find("p").andSelf().addClass("border");                                                                                                                                                                        |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| children([selector]) | Obtener un conjunto de elementos que contengan todos los hijos inmediatos de cada uno del conjunto de elementos que coincidan.  Ejemplo: $("div").children(".selected").addClass("blue");                                                                                           |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| closest(selector)    | Obtiene un conjunto de elementos que contengan todos los hijos inmediatos unicos de cada uno de los elementos que coincidan en el conjunto. Ejemplo: $( document ).on( "click", function( event ) {,$( event.target ).closest( "li" ).toggleClass( "hilight" );});                  |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| contents()           | Busca todos los nodos secundarios dentro de los elementos coincidentes (incluyendo los nodos de texto), o el documento contenido, si el elemento es un iframe.Ejemplo: $( "#frameDemo" ).contents().find( "a" ).css( "background-color", "#BADA55" );                               |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| end()                | Revertir la mas reciente 'destructiva' operacion, cambiando el conjunto de elementos coincidentes a su estado anterior.  Ejemplo: $("p").find("span").css("border", "2px red solid");                                                                                               |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| find(selector)       | Busca los elementos descendientes que coinciden con los selectores especificados.  Ejemplo: $("p").find("span").addClass("selected");                                                                                                                                               |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| next([selector])     | Obtener un conjunto de elementos que contienen los unicos proximos hermanos de cada uno del conjunto de los elementos dados. Ejemplo: $("p").next(".selected").addClass("hilight");                                                                                                 |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| nextAll([selector])  | Encuentra todos los elementos hermanos despues del elemento actual. Ejemplo: $("div:first").nextAll().addClass("hilight");                                                                                                                                                          |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| offsetParent()       | Devuelve una coleccion jQuery con el padre posicionado de primer elemento coincidente. Ejemplo: $("p").offsetParent().addClass('hilight');                                                                                                                                          |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| parent([selector])   | Obtiene el padre directo de un elemento. Si se llama a un conjunto de elementos, el padre retorna un conjunto de elementos unicos directo al elemento padre.  Ejemplo: $("p").parent().addClass('hilight');                                                                         |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| parents([selector])  | Obtiene un conjunto de elementos que contiene los antepasados unicos del conjunto combinado de elementos (excepto por el elemento raiz). Ejemplo: var parentEls = $("p").parents(),.map(function () {,return this.tagName;,}).get().join(", ");,$("b").append("" + parentEls + ""); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| prev([selector])     | Obtiene un conjunto de elementos que contiene los hermanos anteriores unicos de cada conjunto de elementos que coinciden.Ejemplo:,$("p").prev(".selected").addClass("hilight");                                                                                                     |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| prevAll([selector])  | Encuentra todos los elementos hermanos delante del elemento actual.,Ejemplo: $("div:last").prevAll().addClass("hilight");                                                                                                                                                           |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| siblings([selector]) | Obtener un conjunto de elementos que contengan todos los hermanos unicos de cada uno de un conjunto de elementos que coinciden.                                                                                                                                                     |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
 
Hasta aqui esta parte. Si quieren entender mas de los ejemplos de la tabla anterior les recomiendo pasarse por la documentacion oficial de jQuery.

Esta parte ha sido traducida de TutorialsPoint.