Le 17/01/2013 07:16, Kevin Smith a écrit :

    That's what happens with "private" in Java (I don't think most
    Java devs think that the Reflect API makes their private
    attributes actually not private). Java devs could make everything
    public, they choose not to because the cost of putting "public" is
    the same as the cost of putting "private" and the benefits are
    known. In ES5, high integrity privacy has a cost both in code
    readability and runtime, that's why people don't use it. It's not
    that they don't need it, it's just that getting to high integrity
    is annoying.


First, let's point out that Java's private members are for the most part reflectable, and as such they are more akin to unique symbols than private symbols.
Most Java programs do not use reflection (most of the one's I've read at least), so Java's private is as much akin to unique symbols as it is to private symbols.

For OO design purposes at least, we don't need high-integrity privacy.
I don't think the debate is about what people need. Most developers do not know or think about what they need. Give them only unique symbols, they'll use that. Give them only private symbols, they'll use that. I'm actually willing to bet that most developers won't understand the point of unique symbols, because it's easier to stick to strings to do what unique symbols enable. Actually, that's a good question, what's the benefit of unique symbols over string properties for OO programming? I see the downsides, like you can't use the dot notation or that you systematically need an extra variable to use them. But I don't see why anyone should bother changing their code to use unique symbols.

In my opinion, the only valid use case for unique symbols is collision-free extensions, whether it's for @iterator or libraries extending the platform (Array.prototype & friends), why not also jQuery "plugins". The awful-but-widely-used Express plugin could make a good use of unique symbols, because its "add properties on the req or res object" philosophy really is future-hostile. But in that case too, unique symbols wouldn't be used as objects properties (in the OO sense), they'd be used as collision-free keys on the req and res "maps".


    Every project of a decent size needs high-integrity privacy. This
    shouldn't have a barrier to entry. It should just be what people
    do by default. Security shouldn't be considered as a luxury left
    to experts. It should be what naturally comes from writing our code.


I would be willing to admit that every project needs high-integrity privacy, but not without proof. Volumes of code have been written for the Node platform, which is inherently low-integrity. Is the lack of security there a cause for concern among developers?
You said something equivalent to: "volumes of code use eval to parse JSON string. Is the lack of security a cause of concern among developers?" The answer is no, it is not a cause of concern and websites we visit daily do that. But that's not a cause of concern until a malicious user finds out about the eval and abuses it. Then the cost of the mistake becomes absurd by comparison to how much it would have taken to fix it.
It's not a concern... until it becomes one.

I don't think our security should be relying on the fact that no one will find out about the leaks in our code. I know a startup who did that. Some sort of professional social network. I just had to type script elements in messages and it would execute them locally, send them to the server, distribute them to anyone I was in touch and execute the script in their browser. A carefully crafted script could infect all users I could reach after transitive closure. The lack of security wasn't a concern for these developers apparently, but I don't think their concern is relevant. I prefer to think they're happy I told them about the issue before someone malicious (a competitor who'd want to ruin their reputation?) knew about it and could steal every users work and password (needs a bit of additional social engineering, but not that hard to achieve).

What we agree on is that developers should not have to worry about security. The good thing with private symbols is that they can get their job done with a tool that's put them in a secure position *by default*, so that they don't need to become experts in security. It's our role as people who are experts in security (... well, or at least care about as far as I'm concerned) to put the secure easy-to-use tools in the hands of people so that they keep not worrying about security.

Let's take your microwave analogy. There is a clearly defined danger involved with opening the door while the thing is still running: you'll end up blasting your face with radiation. Similarly, we need to clearly define the danger of low-integrity abstractions before we can talk about changing the object model to avoid those dangers.
These dangers are known. Low-integrity abstraction goes against POLA (Principle Of Least Authority). That's the root danger. Now, maybe no one will abuse the extra authority granted by the language... maybe someone will. Maybe you'll use the low-integrity features in ways it can't be abused, maybe someone else won't and put themselves in danger. Maybe no one will abuse the string concatenation you do to craft SQL queries. Maybe someone will. The danger of running with a knife in my hand is low, but it's bigger than running without a knife, so, by default, I choose to run without a knife in my hands. I don't actually actively think about and the low-danger items I could run around with. I just run, because that's what I want to do. Let's have a by-default knife-free JavaScript. If people want to start cutting things, they'll find out where the knifes are.

David
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to