Handlebars.js: Controle de acesso a protopropriedades

Criado em 11 jan. 2020  ·  3Comentários  ·  Fonte: handlebars-lang/handlebars.js

Após os comentários de #1633 e #1634 e os problemas referenciados, acho que seria uma boa ideia criar uma opção de tempo de execução que permita colocar na lista de permissões o protótipo de uma determinada classe.

Chamando o modelo de sagacidade

template ({some: "input object"}, { allowedPrototypes: [
  Test
] })

permitiria que uma propriedade fosse resolvida se o seguinte for verdadeiro.

parent[propertyName] === Test.prototype[propertyName] && Test.prototype.hasOwnProperty(propertyName)

Eu acho que seria útil ao usar classes personalizadas em servidores web, porque certamente não é seguro desativar as verificações de protótipo em tal ambiente.

Gostaria de ter opiniões sobre isso.

feature

Comentários muito úteis

Um problema em potencial é que os usuários esperam que adicionar B aos protótipos permitidos funcione neste caso:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Isso não é tão ruim, só precisa ser documentado, mas provavelmente surpreenderia algumas pessoas.

Todos 3 comentários

Um problema em potencial é que os usuários esperam que adicionar B aos protótipos permitidos funcione neste caso:

class A { get a() { return 'a' } }
class B extends A {}

const parent = new B();
parent['a'] === B.prototype['a'] && B.prototype.hasOwnProperty('a') // => false

Isso não é tão ruim, só precisa ser documentado, mas provavelmente surpreenderia algumas pessoas.

Também podemos verificar se as superclasses estão na lista de permissões, então você só precisa colocar "A" na lista de permissões para que as propriedades de "A" e "B" sejam aceitas.

O contrário é mais difícil, pois exigia a inclusão de todas as classes nativas na lista negra, o que pode mudar com o tempo.

@nknapp Seria possível usar getPrototypeOf e getOwnPropertyDescriptor para ver se o getter foi definido. Não tenho certeza se isso regride aos problemas que já foram corrigidos ou não.

class Example {
  get hello() {
    return 'world';
  }
}

const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }

fonte: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get#get_Vs._defineProperty

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

sontek picture sontek  ·  3Comentários

jlubean picture jlubean  ·  8Comentários

stevenvachon picture stevenvachon  ·  7Comentários

rizen picture rizen  ·  6Comentários

mattkime picture mattkime  ·  4Comentários