Problemas con PHP5-Mcrypt

Me sucedio algo extraño que no encuentro el porque sucedio pero si encontre la solución, resulta que en un servidor con Debian en mi archivo de PHP estaba usando la extensión mcrypt_create_iv la cual genera un vector de inicialización con números aleatorios, mi codigo es asi:

$iv = mcrypt_create_iv(32);

Pero resulta que migre a un servidor Ubuntu y pues a instalar el php5-mcrypt, y por si las moscas mcrypt pero al querer entrar al script se tardaba añooos! y despues de 20,000 minutos!! (jeje bueno no tanto, exagere) me marcaba que: The IV parameter must be as long as the blocksize

Entonces para arreglar este problema es quitar el campo opcional de la función mcrypt_create_iv (MCRYPT_DEV_RANDOM) y poner MCRYPT_DEV_URANDOM quedando algo como esto:

$iv = mcrypt_create_iv(32,MCRYPT_DEV_URANDOM);

Y listo!!!, porque sucedio! sabeeee!.

No reconoce la codificación UTF-8

Por alguna extraña razón los navegadores no reconocen el juego de caracteres UTF-8 de algunas páginas web y simplemente veia caracteres raros en las ñ, acentos.

Se supone que la solución más simple es agregando en el header del documento HTML el tipo de Contenido

Pero nada de nada!!, ni con esa etiqueta funcionaba bien la codificación del HTML, así que solamente nos queda la solución drastica!!, desde Apache especificar el tipo de codificación, por eso debemos de editar el archivo /etc/apache2/apache2.conf (si usamos la ultima versión de apache, sino es /etc/apache/apache.conf) buscamos la linea donde diga AddDefaultCharset y ponemos esto:

AddDefaultCharset UTF-8

Reiniciamos el servidor Apache y listo!!!, ya debe de funciona bien ,pero eso si!!, siempre debemos de usar UTF-8 en lugar del ISO-8859-1

¿Conoces el nombre de los colores para HTML?

Si diseñas páginas de Internet de seguro conoceras que se puede poner los colores ademas de su valor Hexadecimal (color: #FF0033), valor decimal (color: rgb(255,255,0) ) y por su nombre (color:RED), ahora bien conoces los nombres de los colores, lo más seguro es un NO, yo por ejemplo solo me se los nombre básicos, red, blue, navy, gray, black y algunos otros más.

Aquí les pongo una liga en donde vienen TODOS (o casi todos) los colores con su nombre, en realidad segun la página son 500 colores, la verdad ni los he contado jeje, y vienen desde colores tan raros como un slateblue, lawngreen, sgi salmon, cadetblue, crimson, y muchísimos más.

Página con 500+ Nombre de Colores: http://cloford.com/resources/colours/500col.htm

PHP: Generando ID’s unicos

Debido al error en el Jaws cuando genero un Checkbox con muchísimos valores me aparece lo siguiente:

Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/include/Extras/piwi/Utils/PiwiSmart.php on line 216

Y en la linea 216 del PiwiSmart se tiene la función GENERATE

<br /> function managePiwiIds($param, $action)<br /> {<br /> static $piwi_usedIds;</p>
<p> if (!isset($piwi_usedIds)) {<br /> $piwi_usedIds = array();<br /> }</p>
<p> switch($action) {<br /> case 'CHECK':<br /> return isset($piwi_usedIds[$param]);<br /> break;<br /> case 'GENERATE':<br /> while(true) {<br /> $id = $param . '_' . rand(1, 100);<br /> if (!isset($piwi_usedIds[$id])) {<br /> return $id;<br /> }<br /> }<br /> break;<br /> case 'REGISTER':<br /> $piwi_usedIds[$param] = true;<br /> break;<br /> }<br /> }<br /> 

Si observan se tiene un ciclo while y después se genera un numero random el cual se valida, si existe vuelve a generar otro numero, supongo que cuando se tiene varios ID iguales el ciclo se puede volver infinito y más por el error de la función RAND que de seguro siempre regresa los mismos números (entonces no ha de ser tan random??) y ademas solo permite hasta 100 números?? o me equivoco?, bueno, la solución a todo esto es quitar ese while y poner algo como sigue:

<br /> case 'GENERATE':<br /> return $param . '_' . uniqid(rand(), true);<br /> break;<br /> 

Confiando en la función uniqid de PHP :) , si tienen dudas ver documentación.

—————————

uniqid
(PHP 4, PHP 5)

uniqid ? Generar un ID único
Descripción
string uniqid ([ string $prefijo [, bool $mas_entropia ]] )

Obtiene un identificador con prefijo único basado en la hora actual en microsegundos.

Lista de parámetros

”prefijo”
Puede resultar útil, por ejemplo, si se generan identificadores simultáneamente en varias máquinas que pueden estar generando el identificador en el mismo microsegundo.

Con un prefijo vacío, la cadena devuelta tendrá una longitud de 13 caracteres. Si mas_entropia es TRUE, tendrá 23 caracteres.

”mas_entropia”
Si es TRUE, uniqid() agregará entropía adicional (usando el generador de congruencia lineal combinado) al final del valor de retorno, lo cual puede hacer más únicos los resultados.

Valores retornados

Devuelve el identificador único, como una cadena.

—————————–

Bloquear ataques DoS en apache con mod_evasive

Si deseas prevenir un ataque de Denegación de servicio (DoS) cuyo objetivo es colapsar el servidor durante un periodo de tiempo para que este no esté en funcionamiento, ahora bien, si nuestro servidor es Apache podemos contar con el módulo llamado mod_evasive.

El módulo de seguridad para Apache, mod_evasive cuyo propósito no es otro que el de prevenir o anular ataques de Denegación de Servicio o de fuerza bruta basados en peticiones masivas al servidor de páginas web (HTTP DoS). A través del módulo tendremos la posibilidad de redirigir el tráfico malicioso hacia otra aplicación de control que terminará de filtrar las peticiones (firewalls, scripts personalizados, …).

El funcionamiento de mod_evasive se basa en la prevención de ataques mediante la comparación de la IP solicitante con una tabla dinámica que registra las páginas accedidas a nuestro servidor que provienen de dicha IP y la frecuencia de accesos. En el preciso instante en que una máquina solicita una dirección del servidor Apache, mod_evasive filtrará cualquier dirección IP que cumpla con los siguientes requisitos:
* La IP está en la lista de direcciones a filtrar.
* La IP cliente ha solicitado la misma dirección más veces que la cantidad máxima especificada en el fichero de configuración.
* El número de peticiones de la IP cliente excede del máximo permitido en un intervalo de tiempo predeterminado en la configuración.

Si una IP resulta filtrada por cumplir con alguna de las condiciones anteriores, recibirá un código 403 (Forbidden) en respuesta a su petición y le será denegado el acceso durante un periodo de tiempo configurable.

Ahora viene la parte interesante que es la instalación y configuración, antes de empezar debemos de contar con las herramientas necesarias para compilar programas en Linux y en especial para Apache, en este caso estamos usando una versión estilo apt (Debian, Ubuntu…)

apt-get install apache2-prefork-dev gcc

Despues procedemos a descargar el codigo fuente que encontramos en la página oficial del proyecto mod_evasive: http://www.zdziarski.com/projects/mod_evasive (al momento de escribir esta nota la versión es la 1.10.1)

Ahora procedemos a descargar y descompactar el codigo, de preferencia en la carpeta temporal /temp

wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xvzf mod_evasive_1.10.1.tar.gz
cd mod_evasive
/usr/bin/apxs2 -i -c mod_evasive20.c

Ahora vamos a crear el archivo de configuración de Apache2 dentro de la carpeta mods-enabled

nano /etc/apache2/mods-available/evasive.load

Y dentro del archivo ponemos la siguiente linea, que es donde esta nuestro modulo compilado (mod_evasive20.so)

LoadModule evasive20_module /usr/lib/apache2/modules/mod_evasive20.so

Despues sigue ligar la carpeta mods-available con los mods-enabled

ln -s /etc/apache2/mods-available/evasive.load /etc/apache2/mods-enabled/evasive.load

Y listo, solo falta configurar los parametros, tomando en cuenta la siguiente descripción:

* DOSHashTableSize – Establece el número de nodos a almacenar para cada proceso de peticiones de la tabla hash (contenedor asociativo de recuperación de peticiones por medio de claves que agiliza las respuestas del servidor). Si aplicamos un número alto a este parámetro obtendremos un rendimiento mayor, ya que las iteraciones necesarias para obtener un registro de la tabla son menores. Por contra, y de forma evidente, aumenta el consumo de memoria necesario para el almacenamiento de una tabla mayor. Se hace necesario incrementar este parámetro si el servidor atiende un número abultado de peticiones, aunque puede no servir de nada si la memoria de la máquina es escasa.
* DOSPageCount
– Indica el valor del umbral para el número de peticiones de una misma página (o URI) dentro del intervalo definido en DOSPageInterval. Cuando el valor del parámetro es excedido, la IP del cliente se añade a la lista de bloqueos.
* DOSSiteCount
– Cuenta cuántas peticiones de cualquier tipo puede hacer un cliente dentro del intervalo definido en DOSSiteInterval. Si se excede dicho valor, el cliente queda añadido a la lista de bloqueos.
* DOSPageInterval
– El intervalo, en segundos, para el umbral de petición de páginas.
* DOSSiteInterval
– El intervalo, en segundos, para el umbral de petición de objetos de cualquier tipo.
* DOSBlockingPeriod
– Establece el tiempo, en segundos, que un cliente queda bloqueado una vez que ha sido añadido a la lista de bloqueos. Como ya se indicó unas líneas atrás, todo cliente bloqueado recibirá una respuesta del tipo 403 (Forbidden) a cualquier petición que realice durante este periodo.
* DOSEmailNotify – Un e-mail será enviado a la dirección especificada cuando una dirección IP quede bloqueada.
* DOSSystemCommand – El comando reflejado se ejecutará cuando una dirección IP quede bloqueada. Se hace muy útil en llamadas a herramientas de filtrado o firewalls. Usaremos %s para especificar la dirección IP implicada. Por ejemplo, podemos establecer su uso con iptables de la forma siguiente para bloquear el acceso al puerto 80

DOSSystemCommand “/sbin/iptables -I INPUT -p tcp –dport 80 -s %s -j DROP”

O bien!! bloquear todooo el acceso al servidor, esto esta mejor.

DOSSystemCommand “sudo -u root /sbin/iptables -A INPUT -s %s -j DROP”

* DOSLogDir – Establece una ruta para el directorio temporal. Por defecto, dicha ruta queda establecida en /tmp, lo cual puede originar algunos agujeros de seguridad si el sistema resulta violado.
* DOSWhitelist – La dirección IP indicada como valor del parámetro no será tenida en cuenta por el módulo en ningún caso. Para cada dirección IP a excluir ha de añadirse una nueva línea con el parámetro. Por ejemplo, dejaremos fuera del chequeo del módulo a un posible bot (el de Google) que use los siguientes rangos de direcciones:

DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*

Y bien, ya que conocen que significa cada parametro, aquí esta una configuración opcional que se debe de guardar en el archivo /etc/apache2/conf.d/evasive


DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
#DOSEmailNotify cliente@servidor.com
#DOSSystemCommand “/sbin/iptables -I INPUT -p tcp –dport 80 -s %s -j DROP”
DOSSystemCommand “echo %s >> /tmp/mod_doesevasive.log”

#GoogleBot
DOSWhitelist 66.249.65.*
DOSWhitelist 66.249.66.*

Y para probar si realmente funciona todo, en la carpeta donde descompactamos el tar.gz viene un archivo llamado test.pl, solo es cosa de ejecutarlo con:

perl test.pl

Y despues de ciertas peticiones vamos a ver el famoso error HTTP/1.1 403 Forbidden y listo!!, eso significa que todo funciona a la perfección, ahora ya tenemos un Apache un poco mas protegido!..