That would help with Ecto.  Unfortunately we still see a bunch of stuff 
from the likes of Elixir GRPC and various structs from libraries that don't 
have that kind of functionality.  We were kind of hoping for a top-down, 
whitelist approach.  We figure that it's easier to plug the leak from the 
top (*inspect/2* itself) than it is to try to deal with all of the leaks at 
the bottom (everything that tries to use it).

On Friday, November 6, 2020 at 1:15:37 AM UTC-8 allen...@gmail.com wrote:

> I believe that the new changeset "redact" attribute should help with this?
>
> On Fri, Nov 6, 2020 at 4:56 PM 'Jayson Vantuyl' via elixir-lang-core <
> elixir-l...@googlegroups.com> wrote:
>
>> Hey everybody,
>>
>> *Use Case*
>>
>> I have what I think is actually a pretty common problem.  All over my 
>> code base, there are uses of *inspect/2*.  This is a wonderful thing 
>> that helps with debugging.  It is less wonderful when it spews PII all over 
>> your logs / error pages and you find yourself having sent somebody's social 
>> security number to DataDog or disclosed their home address on a 500 page.  
>> Then your lawyer starts doing that thing where their eye twitches, you need 
>> to notify four different regulators on three continents, alert all of your 
>> customers with scary messages, are made to attend 3-hours of mandatory 
>> re-education wherein you learn to recite the GDPR from memory, and 
>> eventually sacrifice three interns to appease the compliance gods.
>>
>> *Temporary Hack*
>>
>> What myself and some co-conspirators have done to address this is 
>> overriding the *Inspect* protocol for the built-in types to redact 
>> things by default and then have a whitelist for the bits we want to show.  
>> Given that our top-level logging metadata is a map, we can pretty much just 
>> whitelist keys there and call it a day.  This works fabulously, but it 
>> violates Erlang's expectations significantly.  While Erlang is probably 
>> used to that, it gets quite cross and refuses to generate a release because 
>> it doesn't have a good way to know which .beam file to put in the release.
>>
>> As you might imagine, I'm pretty bummed that I can't use releases and 
>> have to ignore tons of very alarming sounding warnings about redefining 
>> modules.
>>
>> *Options*
>>
>> Could we consider some solutions to make redaction require less 
>> unforgivable sins against code loading?  To start, three directions have 
>> been proposed by the various people I've talked to:
>>
>>
>>    1. Instead of implementing *Inspect* for the built-in types, do that 
>>    inspection in a handler for *Any*; thereby allowing overriding of the 
>>    built-in types easily.
>>    2. Wedge something into a common entry point (maybe in 
>>    *Inspect.Algebra*?) allows us to specify a global redaction 
>>    function.  Perhaps configure this with a global config value?
>>    3.  Implement some sort of overriding layer for just the *Inspect* 
>>    protocol.
>>    
>>
>> In terms of pros and cons, for #1...
>>
>>    - *Pro:* Works well for built-ins.
>>    - *Pro:* Implementing this is very straightforward.
>>    - *Pro:* This probably doesn't break any existing code, very small 
>>    blast radius.
>>    - *Con:* Doesn't work at all as soon as anything defines its own 
>>    inspection protocol.
>>    - *Con:* Isn't amenable to configuration at runtime (maybe this is 
>>    not an issue?).
>>    
>> As for #2...
>>
>>    - *Pro:* *Can* be configured at runtime.
>>    - *Pro:* I have no idea how to implement this and *Inspect.Algebra* 
>>    scares me.
>>    - *Pro:* This probably doesn't break any existing code, very small 
>>    blast radius.
>>    - *Con:* Given that the Inspect protocol is pretty much "turn X into 
>>    string", I'm not sure how much redaction we could really do if we allow 
>> the 
>>    existing protocol to run.
>>
>> As for #3...
>>
>>    - *Pro:* This provides a clear way to just replace the protocol for a 
>>    given type.
>>    - *Pro:* Implementing this is very straightforward.
>>    - *Pro: *This probably doesn't break any existing code, very small 
>>    blast radius.
>>    - *Con:* It's all fun and games until a library does it, then you 
>>    need Override2 or 3 or 4...
>>    - *Con:* Probably gets redundant if there ever is a blessed way to 
>>    override protocols.
>>    - *Con:* I already pitched this to a few Elixir celebrities and they 
>>    thought it was a bit too hacky.
>>
>> *In Closing*
>>
>> So, yeah, in the long term, maybe we'll have a blessed way to override 
>> protocols; but, short of that, there's got to be some stopgap, right?  What 
>> do people think of adopting something like one of these approaches so that 
>> my PII problems evaporate and I can finally build some sweet, sweet 
>> releases?  I'll even implement it myself!  I promise!
>>
>> Thanks,
>>
>> - J
>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-core" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-co...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-core/d5d9a932-930c-46f7-a3fb-2f1a9ae06112n%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/d5d9a932-930c-46f7-a3fb-2f1a9ae06112n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/38307a23-2568-4c48-ae8c-76cb70e7541bn%40googlegroups.com.

Reply via email to