Horrores en la web local 4
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 = 595Donde 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
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
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
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
rmyy se conecta por defecto a desarrollo o
rmy py nos conectamos a producción…
Otro… ahora que la última versión de RoR incorporó la tarea de poder ver las rutas con
rake routeesta bueno, pero es otro dolor de culo tener que buscar una ruta y escribir
rake route | grep usuariospara 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 mysqlpara 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
!128y 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
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
