Thinking on hiring me?

Please read

Fernando Guillén

a Freelance Web Developer

cabecera decorativa

software development as an artistic expression

Ruby on Rails, Agujero de seguridad en mi API xml

En uno de los pet-projects en los que ando he intentado construir todo un poco académicamente rollo RESTfull (o casi full :) ) y tal.

Pero lo que nos acomete ahora es que he intentado soportar en todas las acciones de controlador en formato .xml.. ¿para qué?.. pues no sé.. pero ahí que lo he dejado.. sin testear ni nada, por si acaso.

Resulta que el otro día me levanté inquieto por la mañana con el pensamiento de que las si se hacía una petición a una acción con el formato .xml la respuesta que le iba a llegar al cliente no me iba a gustar nada.. pero luego se me pasaba y me olvidaba.

Bueno pues la acabo de hacer, acabo de hacer la petición con el formato .xml y, confirmando mis miedos, la respuesta no me ha gustado nada.

http://127.0.0.1:3000/people/103-fernando-guillen.xml (no clckes.. no te va a funcionar :))

<user>
<activated-at type="datetime">2009-02-02T01:01:22+01:00</activated-at>
<activation-code nil="true"></activation-code>
<company-name>Mi company</company-name>
<company-url>http://micompany.com</company-url>
<created-at type="datetime">2009-02-02T01:01:10+01:00</created-at>
<crypted-password>8e2434d3e574c95f4cfd0f457b20c8959ecbf04b</crypted-password>
<iail>xxxx@xxx.com</iail>
<id type="integer">103</id>
<login>fguillen</login>
<name>Fernando Guillen</name>
<password-reset-code>fcc786cd2137679f1055976989f5469607c9d663</password-reset-code>
<permalink>fernando-guillen</permalink>
<personal-web-name>mi web</personal-web-name>
<personal-web-url>http://google.es</personal-web-url>
<public-profile type="boolean">true</public-profile>
<remember-token nil="true">
<remember-token-expires-at type="datetime" nil="true">
<role>User</role>
<salt>5c26f52452d00dbd997f8c6998f5c3de1e4f53f3</salt><text>
Vaya texto guapo que pongo aquí:
 
Con varias líneas
 
y alert("hola");
</text>
<updated-at type="datetime">2009-02-04T18:52:21+01:00</updated-at>
</remember-token-expires-at>
</remember-token></user>

En la respuesta están todos los datos del usuario 103.. ¡todos! hasta la password, aunque está cifrada.. y ¡¡el email!!.. y si hacemos:

http://127.0.0.1:3000/people.xml

Entonces es cuando casi me desmayo..

Alguien podría descargarse toda la base de datos de mi aplicación a base de peticiones .xml o usando ActiveResource.. ¿qué hago ahora?…

  • …¿Eliminar por completo el soporte .xml?
  • …¿Crear vistas .xml para sólo devolver los atributos públicos?
  • …¿Alguna manera de decirle al modelo o al controlador qué atributos quieres que aparezcan en el formato .xml?

Antes de liarme a postear de manera alarmista en éste mi blog, sin solución alguna que ofrecer, comenté estas inquietudes en la sagrada lista ror-es y aparecieron el señor Blat y Pablo Formoso al rescate con un buen par de links y sugerencias:

Estos dos links te enseñan a pasarle parámetros a las invocaciones del método .to_xml de tus modelos de tal modo que puedes poner en tus controladores cosas como esta:

format.xml  { render :xml => user.to_xml( :except => [:email, :crypted_password] ) }

Y así empecé pero no me acabó de convencer pues tengo miedo de olvidarme algún controlador y decido pasar la seguridad al modelo y sobrescribir el método .to_xml de la clase User. Pero los métodos para hacer esto que se sugieren por ahí son un poco tediosas con llamadas a Builder::XmlMarkup y vamos.. un rollo. Lo suyo sería trasladar la facilidad del :except y el :only a la sobrescritura del .to_xml y en los comentarios de este post tenemos una solución bien ingeniosa:

  alias_method :ar_to_xml, :to_xml
  def to_xml(options = {})
    default_except = [
      :activated_at,
      :activation_code,
      :email,
      :login,
      :password_reset_code,
      :permalink,
      :public_profile,
      :role,
      :crypted_password,
      :salt,
      :remember_token,
      :remember_token_expires_at,
      :created_at,
      :updated_at
    ]
    options[:except] = (options[:except] ? options[:except] + default_except : default_except)
    self.ar_to_xml( options )
  end

Sobre todo fíjate en el truqui del alias_method para seguir permitiendo llamadas al comportamiento original del to_xml.

Si sigues los comentarios del hilo que te he indicado verás que las propuestas continúan hasta formar un solución polivalente que bien se puede convertir en un buen parche para Rails.

One Comment to “Ruby on Rails, Agujero de seguridad en mi API xml”
  1. ban khach san da nang gia re Says:

    What’s up Dear, are you genuinely visiting this site regularly, if so after that you
    will without doubt get nice experience.

Leave a comment

a Freelance Web Developer is proudly powered by WordPress
Entries (RSS) and Comments (RSS).

Creative Commons License
Fernando Guillen's blog by Fernando Guillen is licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License.