Horrores en la web local 4

Escrito por nelson Tue, 24 Jun 2008 21:48:00 GMT

Desde hace un tiempo que quiero armar algunos posts sobre horrores que veo en la web, pero aveces no me decido o me tapa el tiempo u otras cosas… pero hoy me saqué con lo que vi…. así que acá va….

Me pasaron el link de http://www.redpanal.com , un nuevo sitio que promete poder convertirse en algo interesante, pero que dudo que lo logre, al menos en su formato actual, pero eso es para otro post. Y me puse a mirar el desarrollo….y la verdad que deja que desear…

Por ejemplo utilizando el siguiente link http://www.redpanal.com/buscar.php?&q=tango&sort=NO_EXISTE se puede ver un error que sale por pantalla y se muestra la sentencia SQL con el error, el primero es un error de configuración del php y el segundo un error de programación pasar datos al query sin validar.

O este otro: http://www.redpanal.com/buscar.php?&q=amador&enviar=Buscar&sort=p.genero%20ASC donde se puede ver al final del link que se usa la sentencia SQL en el HTTP GET para ordenar las listas.

O editando el perfil del usuario (para esto hay que registrarse), se puede llegar a este error ingresando comillas en el nombre:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'hola mundo'', nombre = 'nelson-fernandez', sexo_id = 0, fecha_nacimient' at line 3
UPDATE usuarios SET nombre_contacto = ''hola mundo'', nombre = 'nelson-fernandez', sexo_id = 0, fecha_nacimiento = '--', sitio_web = '', blog = '', AIM = '', yahoo = '', MSN = '', gtalk = '', skype = '', pais_id = 0, provincia = '', ciudad = '', codigo_postal = '', descripcion = '', is_suscripcion_newsletter = 0, is_mail_publico = 0, is_alertas = 0, modified = '1214349162' WHERE id = 595 
Donde se puede obtener como esta armada la base de usuarios.

Viendo eso, solo queda dedicarle algo de tiempo y entusiasmo a http://www.redpanal.com/dologin.php y seguro que algo se va a lograr.

Otro sitio que llamó mi atención fue la parte de clasificados de CriticalDigital. Si se entra a esta página http://clasificados.criticadigital.com.ar/articulos.php y se busca por el tag “type=’hidden’” en el fuente html se van a ver los parámetros para la búsqueda SQL … embebidos en el form HTML !!! ... lo cual lo hace muy apetitoso de ponerse a jugar….. y si se pone uno a mirar el SQL que utiliza para filtrar los distintos tipos de clasificados (autos,casas) es peor todavia ! ... para hacer el filtro utiliza esta sentencia (solo pego la condición del sql):

CLASIFICADO.ID_CLASIFICADO NOT IN (SELECT ID_CLASIFICADO FROM AUTO) AND  CLASIFICADO.ID_CLASIFICADO NOT IN (SELECT ID_CLASIFICADO FROM CASA)

Necesita de 3 selects para filtrar una vista por un artículo a la venta !! y si al sitio le llegara a ir medianamente bien, el costo de armar ese filtro seria carísimo !!! y nuevamente se muestra a los posibles hackers información de cómo están construidas las tablas y poder deducir otras partes del sitio.

Horrores…

BetterNestedSet en Rails 2.1

Escrito por nelson Wed, 11 Jun 2008 01:18:00 GMT

Hay un plugin muy interesante para Rails llamado BetterNestedSet que permite generar modelos con generarquías anidades, el ejemplo clásico son las categorías de un producto, donde puede haber categorías de categorías.

El problema con este plugin es que no funciona bien con Rails 2.1, porque la última versión de Rails modifica los parámetros de un método que este plugin reemplaza.

Ya le envié el patch al autor, mientras tanto dejo acá también la actualización del método en el plugin para cualquiera que pueda necesitarlo.

#reemplazar este metodo en better_nested_set.rb
def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = true, attribute_names = @attributes.keys)
  left_and_right_column = [acts_as_nested_set_options[:left_column], acts_as_nested_set_options[:right_column]]
  quoted = {}
  connection = self.class.connection
  attribute_names.each do |name|
    if column = column_for_attribute(name)
      quoted[name] = connection.quote(read_attribute(name), column) unless !include_primary_key && (column.primary || left_and_right_column.include?(column.name))
    end
  end
  include_readonly_attributes ? quoted : remove_readonly_attributes(quoted)
end

Inicialización no estandar de objetos ActiveRecord

Escrito por nelson Wed, 07 May 2008 18:21:00 GMT

Me estuve peleando con un modelo de ActiveRecord, porque tenía que manejar ciertos estados internos del modelo que no están en campos de la base de datos, sinó que son datos calculados cuando se carga un registro de la base de datos.

El primer intento lo hice haciendo una sobre escritura del método initialize de ActiveRecord pero muy pronto me di cuenta de que no funcionaba cuando se buscaba por un objeto con algún método find.

Luego de hacer muchas pruebas y que ninguna funcionara, terminé mirando la implementación de ActiveRecord a ver si encontraba alguna pista y si, ahí estaba.

Cuando se utiliza algún método de búsqueda, los objetos se instancian con un método llamado ‘instantiate’ y al finalizar se llama a dos callbacks si existen en la clase del modelo, que son :after_find y :after_initialize

Así que todo lo que tuve que hacer fue; mover el código de cálculo de estado del modelo a un método llamado ‘after_initialize’, y ahora anda todo perfecto !

Compartiendo algunos scripts

Escrito por nelson Mon, 28 Jan 2008 23:47:00 GMT

Seguramente la pereza es la madre de muchos de esos pequeños scripts que uno va haciendo para tratar de evitar todas las tareas repetitivas diarias. Acá dejo algunos de mi autoría y algunos que saque alguna vez de internet pero que lametablemente no tomé nota de donde o quien eran :(....

Muchas veces conectado remotamente a un servidor necesito acceder a la base mysql del proyecto RoR activo y es un dolor de culo tener que mirar el database.yml para ver las credenciales y luego escribir la línea a mano para conectarse, para evitar eso, escribí esto:

#! /usr/bin/ruby
require 'yaml'

puts ARGV[0]
case ARGV[0]
when 'd' then env = 'development'
when 'p' then env = 'production'
when 't' then env = 'test'
else
  env = 'development'
end

config = YAML::load_file('config/database.yml')[env]

puts "mysql -u#{config['username']} -p#{config['password']} #{config['database']}" 
system("mysql -u#{config['username']} -p#{config['password']} #{config['database']}")
de esta manera estando parado sobre el directorio raiz del proyecto se puede hacer
 rmy
y se conecta por defecto a desarrollo o
rmy p
y nos conectamos a producción…

Otro… ahora que la última versión de RoR incorporó la tarea de poder ver las rutas con

rake route
esta bueno, pero es otro dolor de culo tener que buscar una ruta y escribir
rake route | grep usuarios
para filtrar la vista… para eso ésta función en bash

rro () 
{ 
    rake routes | grep --color=auto $1
}

ahora solo hay que hacer

rro usuarios

y como plus se tiene el texto buscado resaltado en color ;).. una joyita….

Otra función bash que uso mucho basado en la misma idea es la de búsqueda en el history del bash

function hf()
{
  history | grep --color=auto $1

}
y esto para que ??.. aveces hay comandos largos con parámetros que repetirlos es tedioso, para evitar eso primero buscamos en el history
hf mysql
para obtener todos los comandos en el history que tenga el texto mysql y a la izquierda hay un número con la posición en el buffer, con ese número luego hacemos
!128
y se ejecuta esa entrada en el history ;)

Para terminar les dejo mi pequeño archivo de bash que cargo cada vez que abro una consola

alias l='ls -lah' 
alias h='history'
alias c='clear'
alias ..='cd ..'
alias ...='cd ../..'
alias grep='grep --color=auto'

set -o vi

function hf()
{
  history | grep $1
}

function sf()
{
  svn st | grep \? | sed '/images\/[0-9]\+$/d' | sed '/\.swp/d'
}

function rro()
{
  rake routes | grep $1
}
como cargo este archivo ??... al final de .bashrc tengo:
. ~/bin/bash_alias

bash_alias es el nombre de mi archivo

Espero que a alguien le interese y le sirva!.

Mashups, Javascript y Seguridad

Escrito por nelson Mon, 03 Dec 2007 21:14:00 GMT

Acabo de ver un video de Google Edu sobre Gears and the Mashup Problem que discute la problemática de los mashups y la seguridad javacript.

La verdad que está muy bueno e interesante. Un tío1 de Yahoo! dando una charla en Google sobre el problema y ver como se pueden unir para solucionarlo, utilizando como herramienta Google Gears.

1 las referencias del “tío”: Douglas Crockford is the world’s foremost living authority on JavaScript. He is an architect with Yahoo’s Ajax Strike Force. He is the founder of two startups, and was Director of Technology at Lucasfilm Ltd., Director of New Media at Paramount, and a researcher at Atari and SRI

Anteriores: 1 2 3 ... 15