[Programación]: jEdit, editor de texto avanzado

jEdit es un editor de texto con muchas herramientas para ayudar en el trabajo del programador con muchas y buenas utilidades. Además está escrito en Java, lo que le confiere al programa una capacidad multiplataforma para aquellos desarrolladores que utilicen otros sistemas, como Linux y Mac, puedan usarlo.

jEdit permite el auto-formateado y resaltado de código en más de 130 lenguajes diferentes, tratado de código en forma de árbol con posibilidad de plegado y ocultado de partes, se puede dividir en zonas para trabajar más cómodamente, soporta codificación UTF-8 y Unicode. También permite plugins que se instalarán de forma muy sencilla desde el propio menú del programa una vez instalado.

Información

  • Plataforma: Windows/Linux/Mac (Java)
  • Licencia: Open Source
  • Precio: Gratuito
  • Enlace de descarga: jEdit

via Bitelia

VN:F [1.9.12_1141]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.12_1141]
Rating: +4 (from 4 votes)

Detectar Bot con PHP

En mi trabajo estoy desarrollando una versión nueva del sitio y la semana que viene voy a realizar un pre-lanzamiento en la que van a convivir los dos sitios, el actual y la nueva versión, redireccionando a los usuarios a un sitio o al otro.

Hablando con expertos de SEO, me dijeron que la redirección tiene que ser del tipo Redirect 302 porque sino Google podría detectar contenido duplicado, además también hacer que los bots no vean el otro sitio.

Se me ocurrió esto:

<?php
$SEARCH_ENGINES_UA = "Googlebot|Yahoo|msnbot";
if (preg_match("/$SEARCH_ENGINES_UA/", $_SERVER['HTTP_USER_AGENT']) > 0)
{
 	// Bot
 	header('HTTP/1.1 302 Found');
 	header("Location: http://www.othersite.com/");
 	exit();
}
else
{
 	// Human Being
 	echo 'You are Human!';
}
?>

Para probar que esto realmente funciona, si lo prueba uno, siempre vas a ver el mensaje “You are Human!”, pero si querés ver lo que sucede si fueras un Bot, tendrías que instalarte un Plugin de Firefox para poder simular ser un Bot.

VN:F [1.9.12_1141]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.12_1141]
Rating: +4 (from 4 votes)

[C] – Recursividad

En mi primer día de clases en Programación 2 estuvimos viendo recursividad. ¿Qué es recursividad? Es la forma en la que se especifica un proceso basado en su propia definición. Para entenderlo, voy a citar el ejemplo de mi profesor:

Para ir de un punto A a un punto B puedo ir caminando de a un paso, entonces teniendo la función “ir_al_punto_B” puedo escribir la primer acción que es “dar_un_paso”, en pseudocódigo sería:

ir_al_punto_B()
{
   dar_un_paso;
   return ir_al_punto_B();
}

Ahora, ¿qué pasa cuando llego al punto B? Si no hay un corte, mi función se convierte en un bucle infinito provocando un excesivo uso de memoria provocando el cierre de mi programa. Para solucionar esto, se hace:

ir_al_punto_B()
{
   dar_un_paso;
   si no llegué al punto B
      ir_al_punto_B();
}

Por ejemplo, el factorial.

3! = 3 · (3-1)!
   = 3 · 2!
   = 3 · 2 · (2-1)!
   = 3 · 2 · 1!
   = 3 · 2 · 1 · (1-1)!
   = 3 · 2 · 1 · 0!
   = 3 · 2 · 1 · 1
   = 6
unsigned int factorial(unsigned int n)
{
    if (n > 1)
    {
        return n * factorial(n - 1);
    }
    else
    {
        return 1;
    }
}

Función recursiva para la Multiplicación:

unsigned int multiplicacion(unsigned int a, unsigned int b)
{
    if (b == 0)
    {
        return 0;
    }
    else
    {
        return a + multiplicacion(a, b - 1);
    }
}

¿Cuál es su funcionamiento interno?

¡Tener en cuenta la función de arriba para el seguimiento!

1- Al no ser 0(cero) el valor de b, se analiza la parte falsa del IF y se hace un return llamandose a si misma.

2- Cuando se procesa otra vez la función, el valor de b sigue siendo diferente a 0(cero), se hace un return llamandose a si misma.

3- Luego de este último return, el valor de b pasa a valer 0(cero) y se termina la función quedando pendiente todas las llamadas a la función volviendo hacia atrás devolviendo los resultados. En esta instancia, el return devuelve la suma de 2 + 0 (el resultado de multiplicacion(2, 0) es 0) retornandosela a la instancia anterior.

4- En esta instancia, el valor que devuelve el return es 2 + 2. El resultado de multiplicación(2, 1) es 2). Luego, el valor 4 de este return pasa a la siguiente instancia: 2 + multiplicacion(2, 2) => 2 + 4 = 6 => 2 x 3 = 6

Esto es una introducción básica a recursividad, la semana próxima estaré posteando más cosas. ¡Espero que les sirva!

VN:F [1.9.12_1141]
Rating: 5.0/5 (4 votes cast)
VN:F [1.9.12_1141]
Rating: +4 (from 4 votes)

PHP: Filtrado de datos de Entrada y Salida

Las validaciones se implementan sobre la base de reglas: si un dato cumple con determinadas pruebas, es valido, caso contrario, debe producirse un corte en la ejecución del script e informar lo sucedido al usuario.

filtrado

PHP provee una serie de funciones para escapar datos:

htmlentities: convierte caracteres especiales a las entidades HTML correspondientes. Recibe como argumentos la cadena por convertir, el tratamiento que se dará a las comillas simples y dobles (opcional, ENT_COMPAT para convertirlas las dobles y preservar las simples, ENT_QUOTES para convertir ambas y ENT_NOQUOTES para preservarlas, por defecto ENT_COMPAT), y luego el juego de caracteres (opcional).

Si por ejemplo alguna de las variables tenía contenido javascript malisioso, esto evitará que el navegador lo interprete como tal:

$cad = '';

echo htmlentities($cad);

La salida sería:

&lt;script language=”javascript”&gt;//codigo&lt;/script&gt;

Podemos obtener la traducción completa a partir de la funcion get_html_translation_table (utilizando la constante HTML_ENTITIES), que devuelve un array con los caracteres origen y destino:

echo '
';
print_r(get_html_translation_table(HTML_ENTITIES));
echo '

';

La función html_entity_decode produce el efecto inverso: convierte desde entidades hacia los caracteres correspondientes y recibe los mismos argumentos, es decir, posee la misma interfaz que el método anterior.

La función htmlspecialchars es idéntica a htmlentities sólo que traduce ciertos caracteres especiales de Internet: ampersand (& por &amp;), comillas dobles ( por &quot;), comillas simples ( por &#039;), menor que (< por &lt;) y mayor que (> por &gt;). Recibe los mismos argumentos.

La traducción completa la podemos obtener a partir de la función get_html_translation_table (utilizando la constante HTML_SPECIALCHARS), que devuelve un array con los caracteres de origen y destino:

echo '
';
print_r(get_html_translation_table(HTML_SPECIALCHARS));
echo '

';

Más información | PHP

VN:F [1.9.12_1141]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.12_1141]
Rating: +2 (from 2 votes)

MySql: Seguridad en Base de Datos

A pesar de que las bases de datos poseen sus propios sitemas de seguridad, los scripts PHP pueden llegar a ser una entrada si no se toman las precauciones necesarias.

Un caso importante es el de los datos de conexión. Normalmente, una conexión es utilizada en todo el sitio, lo que supone centralizar los datos de conexión (nombre de usuario, contraseña, nombre del servidor, puerto, nombre de la base de datos, etc) en un mismo archivo que debería estar ubicado por fuera del DocumentRoot. De ésta manera no se podrá acceder a ese archivo a través del navegador de ninguna manera.

Otro método de acceso a la base de datos es a través del SQL injection, que consiste en incluir en las partes variables de una instrucción SQL valores que la modifiquen. Este acceso se hace a través de formularios.

Ejemplo:

Envío de datos desde un formulario a través del método POST

User: Password:
include '/config/conexion.php';

$rs = mysql_query("SELECT * FROM usuarios WHERE username = '$POST[username]' AND passowrd = '$POST[password]'");

if (mysql_num_rows($rs)) {
//succes
}
else {
//error
}

Es una consulta típica. Si completáramos el primer campo del formulario con algo como:

xxx' or 1 = 1

La sentencia final del SQL sería:

select * from usuarios where username = 'xxx' or 1 = 1 --' and password = ''

La cadena — indica el comienzo de un comentario en MySQL, por lo tanto, lo que el motor evaluará finalmente es:

select * from usuarios where username = 'xxx' or 1 = 1

La segunda condición siempre se cumple, por lo que siempre se ingresa al sistema.
Hay muchas maneras de realizar este tipo de ataques, que pueden ser neutralizados filtrando las variables de la consulta con la función mysql_real_escape_string (disponible únicamente para MySQL):

$username = mysql_real_escape_string($_POST[username]);
$password = mysql_real_escape_string($_POST[password]);
...
...
select * from usuarios where username = 'xxx\' or 1 = 1 --' and password = ''

En el próximo post voy a hablar sobre cómo filtrar datos de entrada y salida. La importancia de la validación de datos que ingresan a la aplicación desde el exterior, como el envío de formularios, carga de archivos o el acceso a servicios web.

VN:F [1.9.12_1141]
Rating: 5.0/5 (2 votes cast)
VN:F [1.9.12_1141]
Rating: +2 (from 2 votes)