PHP 5.2.13 Release parchea 30 bugs y medidas de seguridad

PHP.net anunciaba hoy la salida de la versión 5.2.13 de PHP solucionando más de 30 bugs en el funcionamiento de PHP y reparando algunas fallas de seguridad.

Entre ellas errores en las funciones strip_tags, DOMDocument::LoadXML, filter_input, etc..

Se recomienda, como en cada nueva versión la actualisación de los sistemas PHP 5.x.x

Reporte de PHP.net

SyntaxHighlighter formata tus códigos de forma sencilla.

Hace ya mucho me vi en la obligación de crear un pequeño script para formatar correctamente códigos y así poder publicarlos en blogger.

Hace uno o dos días, hablando con yoyahack me explicó que existia una alternativa para "colorear" los códigos en tu blog o web independientemente del cms o la distribución.

Su nombre es SyntaxHighlighter

Su instalación es simple, solo debemos agregar estos códigos js en nuestras cabeceras:

<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeRDark.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'></script>

<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'></script>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'></script>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>


y a la hora de redactar encerraremos nuestro códgio entre:
<pre class="brush: js">

</pre>

o

<pre class="brush: php">

</pre>

Hay más lenguajes que estos dos, solo son los que yo uso más... también podemos omitir los scripts js de los lenguajes que no vayamos a utilizar.

El único inconveniente es que aún necesitamos un pequeño script para hacer la función htmlentities() y así no tener problemas con los símbolos < >.

El script que yo uso es:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" style="margin-bottom:40px">

<div id="formulario">

<textarea rows="20" cols="80" name="codigo"></textarea> <br />
<input type="submit" name="enviar" value="Formatear" /></div>

</form>

<?php

if (!empty($_POST['codigo'])) {

$codigo = $_POST['codigo'];
$codigo = str_replace("t", " ", $codigo);
$codigo = htmlentities(stripslashes($codigo));

$file = fopen("tmp.txt", "w");
fwrite($file, $codigo);
fclose($file);

$lineas = file('tmp.txt');
unlink('tmp.txt');

for ($i = 0; $i < count($lineas); $i++)
$resultado = $resultado.htmlentities($lineas[$i])."<br />";

echo '<h3> Inserta ste codigo en tu site: </h3>' .$resultado.'</div>';
}

?>

Eso es todo.

nax

Sistema de coordenadas y representación de puntos en esta [PHP y 1/2 Ajax]

pantallazo de coordenadas y ejes


El script nace con la idea de crear una representación de rectas según una equación tipo: y = 5x+2

La idea era generar dinámicamente una gráfica donde se representara dicha recta y se calcularan diversos valores como su pendiente y una tabla de valores.

También incluía un sistema ajax con un panel bastante completo para representar puntos, rectas y vectores y poder trabajar con los mismos en tiempo real, es decir, cada ves que se modifica un valor la imagen se actualiza.

El problema surge cuando me entero que js no puede convertir el binario de mi php a una imagen.. ahí se arruina la idea, al menos de momento.

Ideo una segunda forma, guardar el .png y cargarlo en el mismo script y devolver el string listo para insertar en el html. Perfecto! se carga la imagen sin problemas, pero no se actualiza al enviar las coordenadas... así que el sistema ajax a la porra hasta que encuentre un método eficaz para actualizar la imagen...

Así que de momento el script se queda en un simple sistema de coordenadas al cual hay que hacer un 'refresh' cada vez que se quiere modificar la imagen, eso si, la primera ves la carga con ajax o.O"

El script:

- Geometria.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Graficas by Nax</title>
<script language="javascript" src="ajax.js"></script>
</head>

<body>

<div id="opciones">
<b>Puntos:</b><br />
Inserta los puntos (0,0):<br />
<textarea name="puntos" id="puntos" cols="10" rows="5">0,0</textarea><br /><br />
<input type="button" id="enviar" value="Crear" />
</div>

<br />
<br />
<div id="grafica">Aqui va la grafica</div>
</body>
</html> 

- ajax.js
addEvent(window,'load',cargar,false);

function cargar() {
var but = document.getElementById('enviar');
addEvent(but, 'click', creargrafica,false);
}

function enviarcomentario(e) {

if(window.event)
window.event.returnValue = false;
else
if (e)
e.preventDefault();
enviarFormulario();
}

var conexion;
function creargrafica() {
var points = document.getElementById('puntos');
var ran = Math.random();
conexion=crearXMLHttpRequest();
conexion.onreadystatechange = procesarEventos;
conexion.open('GET','grafica.php?points=' + encodeURIComponent(points.value) + '&'+ ran + '=' + ran, true);
conexion.send();

}

function procesarEventos() {
var graf = document.getElementById('grafica');
if (conexion.readyState == 4) {
graf.innerHTML = conexion.responseText;
} else{
graf.innerHTML = "wait";
}

}

//Funciones comunes de ajax
function addEvent(elemento,nomevento,funcion,captura)
{
if (elemento.attachEvent)
{
elemento.attachEvent('on'+nomevento,funcion);
return true;
}
else
if (elemento.addEventListener)
{
elemento.addEventListener(nomevento,funcion,captura);
return true;
}
else
return false;
}

function crearXMLHttpRequest()
{
var xmlHttp=null;
if (window.ActiveXObject)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
else
if (window.XMLHttpRequest)
xmlHttp = new XMLHttpRequest();
return xmlHttp;
}

- grafica.php
<?php
@unlink('test.png');

$points = explode(' ',preg_replace('/rn|r|n/',' ',$_GET['points']));

$y = 400; $y0 = $y / 2; //coordenadas 0,0
$x = 500; $x0 = $x / 2;

$cm = 10; //1 cm = 10 px

//basic
$img = imagecreate($x,$y);
$background = imagecolorallocate($img, 0, 0 , 0);
$color = imagecolorallocate($img, 255, 255, 255);
$green = imagecolorallocate($img, 50, 255, 0);
$red = imagecolorallocate($img, 255, 50, 0);

imagestring($img, 2, 10 ,$y-50, "http://nax-syntaxerror.blogspot.com/", $red);
//ejes basicos
imageline($img, $x0, 0, $x0, $y, $color);
imageline($img, 0, $y0, $x, $y0, $color);

// Lineas de X
for ($i = 0; $i <= $x; $i +=10)
imageline($img, 0+$i,$y0+5,0+$i, $y0-5, $color);

//Lineas de Y
for ($i = 0; $i <= $y; $i += 10)
imageline($img, $x0+5, 0+$i, $x0-5, 0+$i, $color);

//puntos
foreach ($points as $key => $value) {
$ejes = explode(',', $value);
$ejes[0] = $ejes[0] * $cm; $ejes[1] = $ejes[1] * $cm;
imageline($img, $x0+$ejes[0], $y0+(-$ejes[1]), $x0+$ejes[0], $y0+(-$ejes[1])+3, $green);
}

imagepng($img,"test.png");
echo '<img src="test.png" />';
imagedestroy($img);
?>

Cualquier duda o aporte es bien recibido
nax

Criptografía escalar [ PHP ]

Sería muy osado por mi parte decir que el método es mío, aunque quizá lo sea, la verdad se me ocurrió en clase de matemáticas.

El método se basa en el cálculo del producto escalar mediante dos vectores y me atrevo a decir, sin demasiado convencimiento, que es de vía única pero que los expertos comenten…

Un ejemplo:

Teniendo los vectores v(1,3) y w(2,1).

El producto escalar se calcula de la siguiente forma:
v*w = (1*2) + (3*1) = 2 + 3 = 5

Esta fórmula de vectores y puntos la aplicamos a una serie de símbolos siguiendo estructuras de vectores.

Es decir, a cada símbolo le asignamos un valor y dos símbolos representan un vector.

La cadena de símbolos es la siguiente:

!"#$%&'()*+-./0123456789:;<=>
?@ABCDEFGHIJKLMNOPQRSTUVWX
YZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Siguiendo el orden de la tabla ascci y quitando algún que otro carácter.

Así en la cadena “Programmers Team

Los 2 primeros vectores son:
v = (p,r)
w= (o,g)

Los substituimos por su correspondiente valor numérico v=(78,80), w=(77,69) {si no me equivoqué} y se aplica la fórmula.

v *w = (78*77) + (80*69) = 6006 + 5520 = 11526

La conversión toma de dos en dos números. 11 (-), 52 (V), 6 (')

siendo su conversión a string -V'
En definitiva, la encriptación escalar de Prog es -V’
De Programmers team |`!+j&-(T;!
De Latino Hack q3!oI!!
De Bl4ck-P0rtal Wx!C\!-+)
de CUH .X!
y para finalizar de ~ Syntax - Error ~ -j)oO!{^!!

Ahora solo resta dejar el código:

<?php
form
();
$cad explode(' ',"! \" # $ % & ' ( ) * + - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [  ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~");
$men str_replace(' ','',$_POST['message']);

for (
$i 0$i strlen($men); $i += 4) {
   
$cod substr($men$i4);

   for (
$x 0$x <= 3$x ++) {
      if (! 
$cod[$x]) {
         
$cod[$x] = "!";
      }
   }

   
$v1 explode(',',array_search($cod[0], $cad).','.array_search($cod[1], $cad));
   
$v2 explode(',',array_search($cod[2], $cad).','.array_search($cod[3], $cad));
   
   
$escalar $v1[0] * $v2[0] + $v1[1] * $v2[1];

   for (
$y 0$y <= strlen($escalar); $y += 2)
      
$final .= $cad[substr($escalar$y2)];

}

echo 
'<b>Resultado encriptado:</b><br />'.$final;

function 
form() {
   echo 
'<form action="'.$_SERVER['PHP_SELF'].'" method="post">
         Mensaje: <input type="text" name="message" value="'
.$_POST['message'].'" />
         <input type="submit" name="send" value="Enviar">
        </form>
   '
;   
}
?>


Cualquier duda, sugerencia o comentario es bien recibido

Apple Safari 4 y Google Chrome 4 CSS style Stack Overflow Dos/Poc

Hace cosa de 2 horas me llegaba este retweet de Dragon sobre esta vulnerabilidad.

Lastimosamente tengo el chrome 5 y no dispongo de safari así que no lo he probado.

Link del exploit: http://url4.eu/1TCJS

Trabajando con Subversion

Este es un articulo que escribí para el Programmers Team, dejo una parte y el link debajo.


Qué es subversión?

Según Wikipedia Subversión es un software de sistema de control de versiones.
Un sistema de control de versiones (RCS) es una implementación de software para el control de versiones que automatiza las tareas de guardar, recuperar, registrar, identificar y mezclar versiones de archivos.
Es decir, con SVN podemos llevar un registro de quien efectuó que cambio a cual archivo y cuando lo efectuó. En definitiva es una herramienta ideal para el trabajo en equipos de desarrollo.

Porqué usar subversión?

Como he dicho, su principal ventaja es que nos proporciona un control absoluto de los cambios que el software ha sufrido, quien los ha realizado y cuando. Aparte de estas características también podemos acceder a cualquier revisión que necesitemos con unos simples clics.
Por ejemplo si desarrollamos un software y descubrimos que a partir de la versión 23 hay un bug que nos obliga a replantearnos completamente la estructura, en dicho caso podemos volver a la versión 23 y seguir desarrollando a partir de esta.

Qué necesito para usar subversión?

Para utilizar repositorios SVN necesitaremos un host:
  • Google code
  • Source Forge
Hay muchos más, pero estos son los que a mí me han gustado.
Un cliente de subversión, a mi parecer el mejor es TortoiseSVN

Estructura de nuestro Repositorio SVN

La estructura de un SVN es completamente libre, pero se suele seguir este modelo:
Repositorio SVN (/):
  • Trunk: El tronco es la carpeta donde se ejecutan todas o casi todas las modificaciones del software, se podría considerar la carpeta de desarrollo.
  • Tags: La etiqueta se utiliza para almacenar una versión estable o con un objetivo importante realizado.
  • Branches: Las ramas se utilizan cuando queremos implementar una característica al proyecto pero no queremos hacerlo en el Trunk dada su magnitud.

Trabajar con nuestro Repositorio

Una vez creado nuestro repositorio e instalado nuestro cliente vamos a aprender a crear, configurar y trabajar con nuestro repositorio.

Crear un repositorio

Para crear el repositorio creamos una carpeta donde queremos tenerlo, en mi caso en mi localhost.
Clicamos el botón derecho y elegimos la opción SVN Checkout
se ve como hacemos un SVN checkout


En la ventana que se nos abrirá ponemos la url de nuestro host SVN agregando /trunk, ya que tomaremos y guardaremos los datos en la carpeta de desarrollo.
Imagen donde configuramos el repositorio

Recibir y enviar archivos

El comando para recibir los archivos se llama “SVN Update” así que en nuestra carpeta hacemos clic derecho y elegimos dicha opción.
Y se nos abrirá un cuadro de texto dándonos un reporte de los archivos que se modificaron, agregaron o borraron y la versión que disponemos.
Imagen donde se ve el update realizado
En mi caso no se habían ejecutado por lo que no hay archivos y solo me indica la versión actual.
Para enviar los archivos usamos la opción “SVN Commit”, así que ejecutamos dicha acción.
La ventana que se nos abrirá contiene 2 secciones. En la primera podemos agregar un mensaje a la nueva versión del repositorio, normalmente se escribe un texto explicando los cambios, o podemos agregar un mensaje anterior con el botón “Recent Message”.
En la segunda sección tenemos una lista con todos los archivos, si no recuerdo mal dispone de 3 status:

Ausente y buscado colaborador

Bueno al abrir el blog creo que pensé en una via de expresar mis conocimientos y dejar constancia de ellos...

A la ves a sido una forma de practicar un poco de SEO y ver los resultados de diversas estrategias de posicionamiento.

Durante estos 3 o 4 meses que he tenido el blog puedo decir, orgulloso, que he ido incrementando lectores poco a poco (nada exajerado pero yo no esperaba ni 5 personas).
También puedo decir que mis conocimientos se han ido incrementando a causa de este blog.
La necesida de conocer más para poder contarselo al que le interesa me ha dado las ganas de seguir avanzando y no estancarme.

Por todo ello me da cierta pena que, por motivos de estudio, este blog tenga que estar parado durante dos meses. Si que actualizaré cada semana un par de artículos, pero no los 2 artículos por día que llevaba este mes.


Por dichos motivos he pensado que seria buena idea tener un co-productor en el blog.
Es decir, si algún lector de este blog tiene ganas de escribir sobre Programación Web, SEO, vulnerabilidades o cualquier otra temática que involucre directamente el Webmastering que se ponga en contacto conmigo en esta entrada y llegaremos a un acuerdo para ser co-productor de forma indefinida.

Mientras tanto y hasta abril yo me despido y prometo, al menos, esos 2 aportes mensuales.

Un cordial saludo
nax

Vulnerabilidad en Wordpress 2.9

Thomas Mackenzie ha encontrado un bug del tipo Failure to Restrict URL Access en Wordpress 2.9 y superiors.

Los post que están en la basura pueden ser cambiados de usuarios por usuarios logueados en el sistema. Este problema sólo afecta a aquellos sitios que tengan escritores y colaboradores ajenos al círculo íntimo del blogger principal. No es un error de importancia para aquellos blogs como este en el que escribimos un número reducido de personas y que además todas somos administradoras.

Fuente: Segu-info y Linux Hispano

Uniform: Forms elegantes con JQuery

Hace unos días me llego un tweet sobre este script de JS.

Se trata de dar un punto de vista diferente a nuestros formularios, algo elegante, simple y vistoso.

La demo así como la descarga se encuentran en su página oficial:

Uniform - Sexy forms with jQuery

Minify para PHP [Optimización SEO]

Minify es una APP para PHP 5 que nos ayudará a seguir muchas de las reglas SEO de Yahoo!

Combina muchos archivos CSS y JS, elimina espacios en blanco y comentarios innecesarios y los deja en el servidor con compresión gzip y unos headers óptimos para el cliente.

Esto se resume en mayor velocidad de carga y cumplimiento de las reglas SEO de yahoo!

Antes de usar Minify:
 
Después de su uso:

El proyecto se publicó recientemente en google code: Minify on google code

Previsualizar un formulario mediante JavaScript

Hoy me pidieron ayuda con este código y lo dejo por si a alguien le es de utilidad.

Lo que hace es mostrar un "preview" de los datos de un formulario usando la propiedad .innerHTML

<html>
<head>
</head>
<script language="javascript">

function preview() {
   div = document.getElementById('previewform')
   text = "----------------" + 
         "<br /> Formulario <br />" +
         "Nombre: " + document.forms.form1.nomb.value +
         "<br />Apellido: " + document.forms.form1.apell.value +
         "<br />----------------";
   div.innerHTML = text;

}
</script>

<body>

<form id="form1" name="form1" method="get" action="pagina.php">
 <p><strong>Tú Nombre:</strong><input type="text" name="n" id="nomb"></p>
<p><strong>Tú Apellido:</strong><input type="text" name="a" id="apell"></p>
<input type="submit" value="Enviar" style="font-family: Verdana; font-size: 12px; text-align: center; width: 80; height: 25; font-weight: bold"><br>
<input type="reset" value="Borrar" style="font-family: Verdana; font-size: 12px; text-align: center; width: 80; height: 25; font-weight: bold">
<input type="button" value="Preview" style="font-family: Verdana; font-size: 12px; text-align: center; width: 80; height: 25; font-weight: bold" onclick="javascript:preview()" />
</center>
</form>

<div id="previewform"> </div>
</body>

</html>

El creador de MySQL lanza MariaDB, el sustituto de MySQL

¡Así es! El creador de MySQL Michael Wideniur, anunció en su blog personal el lanzamiento de un nuevo producto, un motor de bases de datos basado en el mismo MySQL y nos invita a testearlo.
En el sitio oficial, se puede ver toda la documentación de este nuevo motor de bases de datos. Aunque hay que tener en cuenta que este aplicativo no fue desarrollado desde cero ya que como hemos mencionado está basado en MySQL.

Leer entrada completa: Programando ideas

Vulnerabilidad en Wordpress: Full Path Disclosure

Hoy revisando los mensajes en elhacker.net leo un pequeño aviso de full path disclosure en Wordpress.

No comenta si son solo algunas versiones o todas, lo que es evidente es la vulnerabilidad.

El FPD se proudce en el directorio /wp-includes/.

El motivo, sospecho, se debe a que Wordpress trabaja mesclando varias páginas, y al abrir una de estas sin las demás se produce un error al intentar cargar una función como es el caso:

Fatal error: Call to undefined function add_filter() in /home/-censored-/public_html/wp-includes/user.php on line 70

Como se puede apreciar se produce un error intentando cargar una función llamada add_filter y eso nos da el FPD.

La solución:

Se me ocurren dos:

La primera podría ser agregar error_reporting(0); en cada linea del documento.

La segunda, depende más de la forma de trabajar de Wordpress, pero sería imitar en parte el método de SMF con un define('WP', 1) y en cada página comprobar si está definida o die();

La forma de encontrar el FPD fué al entrar al directorio /wp-includes/ y desde allí ir abriendo archivos hasta que uno de error, en caso de que no apache no nos indexen los archivos también podemos buscar los archivos afectados.

Entre los archivos afectados están update.php, user.php y rss.php por citar tres de ellos.

Ahora que conocemos el problema y la solución, solo falta protejer nuestro blog de wordpress, si lo tenemos.
Saludos

Redirecciones 301, una ves ya indexado...

Aveces en nuestro camino por mejorar el SEO descubrimos que las url actuales de las cuales disponemos (.php?var=data&other=something) no son una buena elección para indexar en un buscador y optamos por dar el paso a las url amigables (/data/something)

El principal problema viene cuando estamos indexados y dicha indexación ocupa lugares relativamente buenos en algunos buscadores.

La solución a estos problemas es la redirección 301, lo que hace esta redirección es decirle al buscador "esta url a partir de ahora será esta otra" y el bot indexa y rankea nuestra web de una forma óptima, el desastre que podriamos causar sin redirecciones 301 es inmenso...

.htaccess y la redirección 301:

Nota: Se recomiendan conocimientos previos en el manejo de htaccess


Un primer ejemplo de redirección permanente:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteBase /
   RewriteCond %{HTTP_HOST} !^mysite.com [NC]
   RewriteRule ^(.*)$ http://mysite.com/$1 [L,R=301]
</IfModule>



Lo que estamos haciendo es redirijir http://mysite.com hacia http.//www.mysite.com

PHP y la redirección 301:

En el documento de php colocamos:

<?php
   Header
"HTTP/1.1 301 Moved Permanently" );
   
Header"Location: http://www.mysite.com/newUrl" ); ?>


ASP y redirección 301:

<%
   Response.Status="301 Moved Permanently"
   Response.AddHeader "Location", " http://www.mysite.com/page.asp"
%>


ASP.net y redirección 301:

private void Page_Load(object sender, System.EventArgs e)
{

   Response.Status = "301 Moved Permanently";
   Response.AddHeader("Location","http://www.new-url.com");
}


Existen mas formas de redirijir con otros lenguajes, como por ejemplo HTML

pero la forma de HTML no está bien vista por los bots.

Día por la Seguridad en Internet: Piensa antes de publica

Hoy 9 de febrero, organizado por INSAFE, se celebra simultáneamente en más de 60 países la séptima edición del "Día Internacional por la Seguridad en Internet". Este año el lema escogido es "Piensa antes de publicar (Think B4 U Post!)".

INSAFE es una iniciativa Europea cuyo objetivo principal es concienciar a instituciones, educadores y padres con el fin de promover el uso seguro y responsable de las Tecnologías de la Información entre menores y adolescentes.

Leer completo en seguinfo

Chuleta vulnerabilidades OWASP Top 10 2010



Hoy en Google Reader me encuentro que Jeff Williams compartia este pdf proveniente del blog greeboo.net bajo la licencia de Creative Commons Attribution-Share.

El PDF trata de un TOP 10 de vulnerabilidades/errores a la hora de la programación de aplicaciones.

Desde las ya más que conocidas Injections y XSS pasando por sessiones de usuario desprotejidas, poca encriptación, etc.

Son 2 hojas que realmente vale la pena tener cerca a la hora de programar nuestra aplicación.

Descargar: OWASP 2010 TOP 10

0day en base de datos oracle

Un experto en seguridad informática considera que nueve de cada diez bases de datos Oracle son vulnerables a un ataque que podría dar a los hackers el acceso y control de la sensibilidad de las empresas y los sistemas de base de datos del gobierno, sin la necesidad de una identificación de usuario o contraseña.

David Litchfield, jefe de investigación en NGSSoftware Ltd, una compañía con sede en Reino Unido dijo haber reportado a Oracle la vulnerabilidad desde Noviembre (Oracle 10.2.0.4), pero no fue solucionado en los parches de seguridad de enero. Por lo que ha decidido hacerlo público (”11g 0day exploit”) durante la conferencia Black Hat en Washington el miércoles.

Litchfield dijo que “permite a un atacante sin un ID de usuario y contraseña tomar el control completo. Todos los firewalls se vuelven irrelevantes”.

Aunque es posible prevenir la explotación cambiando la configuración por defecto del software, Litchfield cree que nueve de cada diez bases de datos son vulnerables. Añadió que no había manera de saber si los hackers ya aprovechan la vulnerabilidad para acceder a una base de datos.

Mientras tanto Black Hat retiró el video de David Litchfield donde se mostraba el código y Oracle no ha hecho algún comentario al respecto.

Fuente: latinohack.com

Obtener la dirección IP [PHP]

Hoy vamos a comentar una función con la que me topé por internet para obtener una ip


<?php
function getIP() {
    if (isset(
$_SERVER)) {
    if (isset(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
    return 
$_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
    return 
$_SERVER['REMOTE_ADDR'];
    }
    } else {
    if (isset(
$GLOBALS['HTTP_SERVER_VARS']['HTTP_X_FORWARDER_FOR'])) {
    return 
$GLOBALS['HTTP_SERVER_VARS']['HTTP_X_FORWARDED_FOR'];
    } else {
    return 
$GLOBALS['HTTP_SERVER_VARS']['REMOTE_ADDR'];
    }
    }
}
 
$ip getIP();  
?>


Es una función muy simple, primero comprueba si existe el array global $_SERVER en caso de que no exista intenta hacerlo lo mismo pero mediante el array $GLOBALS.
Algunos proxyes dejan la ip del usuario en HTTP_X_FORWARDED_FOR, por esta razón primero comprobamos si exsite, en caso de que exista esa es la IP real.
Sino tomamos el valor REMOTE_ADDR.

Este script, como todos los de GETIP, no garantiza que la ip tomada sea la verdadera pero tienes mas probabilidades que con otros que he visto en la red

Las variables variables de PHP

Aunque suene un tanto raro existen y quizá cueste un poquito de captar a la primera, así que recomiendo la doble lectura.

En algún momento dado podemos necesitar que el contenido de una variable sea el nombre de la varable.
Ejemplo:
tenemos la variable $boque =  "arbol";
queremos asignarle a una variable $arbol = "verde"; pero no siempre será arbol también podria ser planta.

Entonces, como lo hacemos? Ya que:

<?php

  $bosque 
$arbol "verde"; ?>


solo conseguimos 2 variables con el valor verde, que no es lo que buscamos.
Aquí entran las variables variables.

Asignación de una variable normal:

<?php

  $bosque 
"arbol"; ?>


Ahora una variable variable siguiendo el ejemplo anterior:


<?php

  
$$bosque "verde"; ?>


Y el efecto es asignar la variable $arbol = "verde";

Saludos
Nax

Rotación de imagenes con JavaScript

Hoy es domingo y he tenido un día ajetreado así que a diferencia de otros días les dejo un code muy sencillo en javascript del cual pedian una ayuda en LH

Hace una rotación de X imágenes cada Y segundos durante un tiempo indefinido.

<html>
<head>
<title>Secuencia</title>

<script language="javascript">

var SecuenciaEjecutandose = false
var SecuenciaID = null
var imagen = 4
var duracion = 1000

if ( CompruebaVersion() ) {
imagenes = new CreaArray( 4 )
imagenes[1].src = "imagen1.jpg"
imagenes[2].src = "imagen2.jpg"
imagenes[3].src = "imagen3.jpg"
imagenes[4].src = "imagen4.jpg"
}

function CompruebaVersion() {
if (navigator.appVersion.charAt(0) >= 3 && document.images) 

return true
else return false
}

function CreaArray(n) {
this.length = n
for (var i = 1; i<=n; i++) {
this[i] = new Image()
}
return this
}

function DetenerSecuencia () {
if( SecuenciaEjecutandose )
clearTimeout(SecuenciaID)
SecuenciaEjecutandose = false
imagen = 0
}

function MostrarSecuencia () {
if (CompruebaVersion()) {
document.images["secuencia"].src = imagenes[imagen].src
imagen++
if ( imagen == 5 )
imagen = 1
}
SecuenciaID = setTimeout(" MostrarSecuencia() ", duracion)
SecuenciaEjecutandose = true
}

function IniciarSecuencia () {
DetenerSecuencia()
imagen = 1
MostrarSecuencia()
}

</script>

</head>

<body onLoad="IniciarSecuencia()">
<img src="imagen1.jpg" width="100" height="100" alt="Secuencia" 

name="secuencia"> 

</body>
</html>

 

Como se aprecia en el code el script carga 4 imágenes en un array y esas imágenes las va pasando por una etiqueta llamada secuencia.

saludos
nax

Cifrado vigenère [code PHP]

Hoy os presento un code sencillo que se comentó por DragonJAR y como estaba aburrido decidí crear un cifrador.

El cifrado es vigenerè y es, básicamente, el cifrado cesar un poco mas avanzado.

Como yo no soy bueno comentado la historia me centro en las matemáticas:

El cifrado recive 3 parámetros:

- Mensaje a cifrar
- Clave
- Cantidad de letras del abecedario (este 3er parámetro es una constante)

La fórmula del cifrado vigenère es:

Yi = (Xi + Zi) mod T

Donde:

Xi = letra original
Zi = letra clave

T = 26 (letras alfabeto -1 , ya que empezamos de 0)

Un ejemplo:

Xi = A
Zi = B

Yi = (A + B) mod 26
Yi = (0 + 1) mod 26

Yi = 1 = B

Siendo:
A = 0
Z = 26

El código es:

<?php

form
();
$message strtolower(str_replace("n"," ",$_POST['message'])); $clavestrtolower($_POST['clave']); $final "";
$letters explode(' ',"a b c d e f g h i j k l m n o p 

q r s t u v w x y z"); $saltar explode(' ''º Âª  ! | " @ Â· # $ ~ % 
â�¬ & Â¬ / ( ) = ? ' Â¿ Â¡ ^ ` [ ] + * Â¨ Â´ { } Ã§ - _ . : , ;');

for (
$i = 0, $x = 0 ; $i < strlen($message); $i++, $x++) {
   
   if (
$x >= strlen($clave))
      
$x = 0;
   
   if (in_array(
$message[$i],$saltar) || $message[$i] === ' ') {
      
$final .= $message[$i];
      
$x--;
   }else {
      
      
$vigenere = (array_search($message[$i],$letters) + 

array_search($clave[$x],$letters) ) % 26 ;

      
$final .= $letters[$vigenere];

   }
}

echo '<b>Resultado encriptado:</b><br />'.strtoupper(
$final);

function form() {
   echo '<form action="'.
$_SERVER['PHP_SELF'].'" method="post">
         Mensaje: <br /> 
            <textarea name="message">'.
$_POST['message'].'</textarea><br />
         Clave: <input type="text" name="clave" value="'

.$_POST['clave'].'" />
         <input type="submit" name="send" value="Enviar">
        </form>
   ';   
}

?>


La cadena $saltar se ha desformatado al convertir el código así que la dejo aparte:

$saltar = explode(' ', 'º ª \ ! | " @ · # $ ~ % € & ¬ / ( ) = ? \' ¿ ¡ ^ ` [ ] + * ¨ ´ { } ç - _ . : , ;');


Explicación:

Básicamente lo que hacemos es crear un array del abecedario, para asignar de forma rápida el 0 = a y z = 26.
Después de eso tomamos un bucle donde usaremos 2 contadores, $i para el mensaje y $x para la clave.

La variable que hará salir del bucle es $i, ya que cuando se acabe el mensaje se acabará el bucle.
$x sin embargo se repetirá cada vez que se termine.

La variable $saltar nos permite saltarnos ciertos carácteres que no forman parte del abecedario y disminuimos $x en 1 ya que no usamos la letra clave para encriptar.

Luego ya solo es cuestión de buscar la letra del mensaje en el array y tomar el valor de la key sumarlo al valor de la letra clave y hacer mod entre 26.

Ejemplo de uso:


Espero que les guste y quizá con mas tiempo hago el decrypter.

Cambiar mayúsculas y minusculas en la clave de un array

Hoy me vi en el aprieto de hacer una búsqueda de la clave de un array y retornar el valor.

El problema viene generado porque la clave puede estar tanto en mayúsculas como en minúsculas y eso puede afectar negativamente en la búsqueda de la clave probocando un resultado FALSE incorrecto.

Ejemplo: si busco A pero en el array existe a, dará false cuando en realidad es true.

Para hacer la búsqueda opté por una función quizá poco conocida: array_change_key_case()

Funciona de la misma manera que strtolower() y strtoupper() pero en las claves del array.

Un ejemplo de la función:

<?php

$var 
= array("Una" => 1"dOs" => 2);
var_dumparray_change_key_case($var,CASE_LOWER));
// Salida: array(2) { ["una"]=>  int(1) ["dos"]=>  int(2) }
?>


como se puede apreciar las keys ahora son en mínusculas.

Tenemos las dos posibilidades: CASE_LOWER y CASE_UPPER

Ahora podemos hacer búsquedas en arrays sin miedo a dar falsos negativos.

Rainbow Login con JQuery y PHP

Login Rainbow es un efecto del borde con varios colores simulando un arcoiris.

Me parece muy bueno estéticamente y se le puede sacar gran partido.

El código no estaba al acceso público (los JS si pero la parte php no..)

Pero un usuario a simulado los PHP y nos ha dejado este gran efecto con JQuery.

Source code

forgot.php script: http://www.manifestinteractive.com/usenet/login...
checklogin.php script: http://www.manifestinteractive.com/usenet/login...

Demo

Página de Dragon Labs

Blend: Efecto con Jquery

Este también me topé buscando sobre lightbox

Se trata de efectos de botones y fondos.

Están muy interesantes y bonitos


La demo

La descarga

En la demo vemos varios efectos, el primero es solo css

El segundo es css y jquery con el efecto blend

El tercero es css y jquery con blend y pulse (como si se encendiera y se apagara)

El cuarto es css y jquery con reverse (el mismo efecto pero al revés)

espero les guste

ColorBox un LightBox con JQuery

Cuando estaba escribiendo sobre Lightbox 2 topé con esta biblioteca que me pareció muy atractiva.

Funciona de forma similar a Lightbox 2 aunque en mi opinión es más rápida y estética.

La demo

La descarga

Para más información visiten su página web.

web: www.colorpowered.com

LightBox 2 expandir imágenes con JavaScript

Lightbox 2 es una de esas aplicaciones para poder ver la imagen en grande a partir de una miniatura en la misma página web sin necesidad de cargar un pop-up y de una forma elegante.

Lightbox 2 utiliza el framewor Prototype y Scriptaculous Effects Library.

La demo

la descarga

Un ejemplo de código:

<html>
<head> </head>
<body>
<script type=\"text/javascript\" src=\"js/prototype.js\"></script>
<script type=\"text/javascript\" src=\"js/scriptaculous.js?load=effects,builder\"></script>
<script type=\"text/javascript\" src=\"js/lightbox.js\"></script>
<link rel=\"stylesheet\" href=\"css/lightbox.css\" type=\"text/css\" media=\"screen\" />

<a href=\"images/image-1.jpg\" rel=\"lightbox\" title=\"my caption\">image #1</a>

<a href=\"images/image-1.jpg\" rel=\"lightbox[roadtrip]\">image #1</a>
<a href=\"images/image-2.jpg\" rel=\"lightbox[roadtrip]\">image #2</a>
<a href=\"images/image-3.jpg\" rel=\"lightbox[roadtrip]\">image #3</a>

</body></html>


Nota: el primer <a href=""> hace referencia a una imagen unica

los siguientes lo hacen a un grupo de imagenes (por lo cual tenemos un botón next y prev.

Web del autor

PHP 5 stars un rating con estilo

PHP 5 stars es una aplicación del tipico "rate me" con 5 estrellas.

Es algo diferente a las demás y me gusta el toque que deja

Para usarlo se necesita sqlite en el apartado PDO de nuestro hosting.

Saberlo es muy simple, simplemente creamos un script

<?php phpinfo(); ?>

lo subimos al hosting y buscamos sqli en el apartado PDO

Click here to enlarge

Ejemplo de uso:

Agregamos esto al head:



<link rel="stylesheet" type="text/css" href="rating/rating.css" media="screen"/>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" >google.load("jquery","1.3.2");</script>
<script type="text/javascript" src="rating/rating.js"></script>
<?php include('rating/rating.php'); ?>


y agregamos esto a cada objeto que queremos que tenga las estrellas:

<?php rating_form("unique_table_name"); ?> a cada elemento que queramos tener las estrellas.

donde unique_table_name es el nombre de la tabla en slqi

Demo, descarga y web del autor

saludos

La clase MySQLi

Hoy mismo hablé sobre el uso de mysql_connect pero ahora quiero hablaros de la clase MySQLi que un user de CUH (p3ll3) comentó sobre ella y yo no la habia tenido en mente.

Un código básico de MySQLi:

<?php
$con 
= new MySQLi('host''usuario''pass''db');
$query $con->Query("SELECT algo, otro FROM tabla WHERE id = 1");

while (
$q $query->fetch_object()) {
    echo 
"Hola soy ".$q->algo." y "$q->otro;

}
$query->close(); $con->close();
?>


Como se puede comprobar es bastante sencillo, creamos un objeto con la sentencia new, le decimos que se trata de MySQLi y le pasamos los parámetros de conexión: host, usuario, contraseña y base de datos, aquí ya se nota una mejora por el hecho de no tener que usar mysql_select_db().

Luego para ejecutar una consulta simplemente tomamos el objeto y le indicamos la acción Query seguida de la consulta.

Para accesar a los datos lo hacemos igual que con mysql_query solo que en el while en ves de poner mysql_fetch_array() ponemos la variable y fetch_object().

A la hora de acceder a los datos normalmente lo hariamos como un array $q['algo'] pero con MySQLi se hace así $q->algo.

Eso es todo referente a MySQLi

La Función mysql_connect

No hace mucho publiqué el siguiente artículo en el foro de CUH, el cual se ve que agradó y me solicitaron un poco mas de información, así que os dejo el post completo por si es de ayuda para alguno.

Para establecer una conexión a una base de datos mysql utilizaremos myql_connect().

Esta función se suele almacenar en una variable ya que en futuras acciones debemos decirle cual es la conexion.

Sintaxis:

$variable = mysql_connect([$host],[$usuario],[$password],[$nuevolink],[$flags])

todo es muy simple... un ejemplo de variables sería:

<?php

$host
="localhost"; $usuario="root"; $password=""//sin pass $nuevolink=true; $flags=MYSQL_CLIENT_SSL  
?>


Todos los parámetros de esta función son opcionales... y direis: COMO???, así no hay forma de saber donde conectar...

Bien, hay un detalle que parece ser que mucha gente no usa en cuanto a $host $usuario y $password...

Existe ese maravilloso PHP.ini que tiene unas directivas especialmente para esta función, y en caso de que no se pase un parámetro conectará mediante dichas directiva. Las directivas son:

mysql.default_host =
mysql.default_user =
mysql.default_password =


si les ponemos valores a estas directivas ya no hará falta especificar datos de conexión.

$nuevolink

Por defecto es false y su utilidad en true es que si hacemos otra llamada con los mismos argumentos no establecerá un nuevo link sino que utilizará el que ya se habia creado previamente, por eso no se suele usar..

$flags

Las flags de mysql_connect son:

MYSQL_CLIENT_COMPRESS
Protocolo de compressión

MYSQL_CLIENT_IGNORE_SPACE
Permitir espacios después de nombres de funciones

MYSQL_CLIENT_INTERACTIVE
Permitir los segundos interactive_timeout (en ves de wait_timeout) de inactividad antes de cerrar la conexión

MYSQL_CLIENT_SSL
Encriptación SSL

Eso es todo para mysql_connect() normalmente se usan los 3 primeros parámetros así que si no entendeis el resto no os comais mucho la cabeza

Facebook nos presenta HipHop for PHP

Ayer hablabamos que el compilador de PHP era un JIT.

Hoy podemos obtener más información gracias a vivaPHP!

Según el ingeniero Haiping Zhao, HipHop for PHP les permitió reducir un 50% el uso de sus CPU lo cual implica un mejor rendimiento en la aplicación Facebook.

Hip Hop for PHP lleva ya 2 años de desarollo, pero reconocen que aún no está finalizado y que la actual versión puede considerarse una beta.
Se ha liberado bajo la misma licencia de PHP lo que permitirá a la comunidad acabar el desarollo de la aplicación dando su punto de vista y sus ideas.

Zhao nos explica que es realmente HipHop:

“HipHop no es técnicamente un compilador. En su lugar es un transformador de código. HipHop transforma tu código fuente PHP en un altamente optimizado código C++ y luego usa g++ (GNU C++) para compilarlo. HipHop ejecuta el código fuente en una manera semánticamente equivalente y sacrifica algunas características raramente usadas -como eval()- a cambio de una performance mejorada. HipHop incluye el transformador de código, una reimplementación del runtime de PHP y una re-escritura de varias extensiones de PHP comunes para aprovechar estas optimizaciones”.

Fuente: vivaPHP!

Sistema de comentarios simple con captcha

Bueno he avierto otro post porque en el otro hay muchos comentarios de todo tipo, no se si aún lo necesias pero como hace poco me pidieron lo mismo te dejo el trabajo:

El sistema de comentarios estaba pensado para funcionar igual en diferentes secciones de la web... compartiendo tablas de la DB y solo modificando un campo entre las diferentes secciones.

SQL: 


CREATE TABLE IF NOT EXISTS `web_michelmin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`autor` varchar(50) NOT NULL,
`hora` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`comentario` text NOT NULL,
`seccion` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



<?php

#~~ Connect.php
$host 'localhost';
$user 'root';
$pass '';
$db 'z_test'//nombre de la bd
$tabla 'web_michelmin'//nombre de la tabla a usar

$con mysql_connect($host$user$pass) or die(mysql_error());
mysql_select_db($db,$con) or die(mysql_error());

?> 



Parte que se agrega a la página:


<?php 
session_start
();
#~~ Comentarios a final de página; 

include_once('conect.php');

$seccion 'index'//Nombre que le quieras dar a ala seccion 

$comentarios mysql_query("SELECT comentario, autor FROM ".$tabla." WHERE seccion = '".$seccion."' "$con) or die(mysql_error());

echo 
'<table border="1">';

 

    while (
$coments mysql_fetch_array($comentarios)) { 

 

       echo 
'<tr><td colspan="2"><sub><strong>'.$coments['autor'] .'</strong></sub></td></tr> 

               <tr><td colspan="2">'
nl2br(htmlentities($coments['comentario'])) . '</td></tr>'

    } 

 

echo 
'<tr><td colspan="2"></td> 

      </tr><tr><td colspan="2">Escribe tu comentario: </td></tr> 

      <tr><td colspan="2"> 

          <form method="post" action="update.php"> 

            Autor: <input type="text" name="autor" size="31" maxlength="50" value="" /> 

        </td>
    </tr>
    <tr> 

        <td colspan="2"> 

            Comentario: <br /> 

            <textarea name="coment" cols="31"></textarea>  

            <input name="seccion" type="hidden" value="'
.$seccion.'" />
            
        </td>
    <tr>
        <td>
            Captcha:
        </td>
        <td>
            <img src="captcha.php" /> <br />
            <input type="text" name="captcha" size="10" maxlength="7" value="" />
            </div>
            <br /> 

            

        </td>
    </tr>

        <td colspan="2" align="center">
            <input name="Enviar" type="submit" /> 
        </td>
    </tr> 

        </form> 

    </table>'
;
    
    if (
$_GET['err'])
        echo 
"<b>Ha introducido un captcha incorrecto</b>";

?> 



se modifica la variable $seccion dandole el nombre de la página donde se incrustara el código sin el .php de esta forma separamos las diferentes páginas que tendrán un comentario y a la vez redirijimos en el update.php

update.php:
por errores con los headers no hago un include a conect.php...

<?php
session_start
();


$coment $_POST['coment'];
$seccion $_POST['seccion'];
$autor $_POST['autor'];

if (
$_POST['captcha'] && $_POST['captcha'] == $_SESSION['rand'])
{


$host 'localhost';
$user 'root';
$pass '';
$db 'z_test';
$tabla 'web_michelmin';
$con mysql_connect($host$user$pass) or die(mysql_error());
mysql_select_db($db,$con) or die(mysql_error());


$update mysql_query("INSERT INTO " $tabla " (id, autor, hora, comentario, seccion) VALUES (NULL, '" $autor "', CURRENT_TIMESTAMP, '" $coment "', '" $seccion "') "$con) or die (mysql_error());

header("location: "$seccion .".php");

} else
    
header("location: ".$seccion .".php?err=badcaptcha");
?> 


captcha.php (esta parte es de shell root si no me equivoco)

<?php

# Em3trix

session_start();

$x ImageCreateFrompng("captcha.PNG");

$numeros rand(0000,9999);
$letras "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

$final $letras{rand(1,50)};
$final .= $letras{rand(1,50)};
$final .= $letras{rand(1,50)};

$rand $numeros.$final;

$rand2 $rand[3].$rand[5].$rand[1].$rand[6].$rand[2].$rand[7].$rand[3];

$color imagecolorallocate($x,"250","0","0");
$string imagestring($x,5,"13","7","$rand2",$color);

$color1 imagecolorallocate($x,"250","250","0");
$color2 imagecolorallocate($x,"0","250","0");
$color3 imagecolorallocate($x,"0","0","250");

$linea imageline($x,"0","20","100","10",$color3);
$linea imageline($x,"0","10","20","100",$color1);
$linea imageline($x,"50","0","100","100",$color2);

ImageGIF($x);

$_SESSION['rand'] = $rand2;

?> 


Estilos css = 0 soy malo con eso y al final cada uno tiene su estilo xD así que espero os sirva.