Thanks Nikita, that's good to know. I'm still familiarizing myself with the
source right now, so I apologize if this is something that commonly gets
spread as false information, I honestly was exploring the workings of
injection protection in the source after following this discussion, but
that's why I asked. My intention was not to spread FUD, I just thought I'd
found something that slipped through the cracks.

Cheers,
Jordan

On Mon, Jul 19, 2021 at 12:24 AM Nikita Popov <nikita....@gmail.com> wrote:

> On Sun, Jul 18, 2021 at 4:42 AM Jordan LeDoux <jordan.led...@gmail.com>
> wrote:
>
>> Related to the general topic of injection attacks, I was considering
>> submitting a PR to change the default of PDO::ATTR_EMULUATE_PREPARES to
>> FALSE, since this mistakenly can lead people to believe that using
>> prepared
>> statements with PDO and MySQL protects against injection attacks. In fact,
>> this is only the case if they create the PDO object with the option
>> specified as false. I'm not aware however to reasoning for enabling
>> prepare
>> emulation by default for MySQL. I would assume it's a performance choice,
>> but how long ago was this choice made and is it worth revisiting? Would
>> this be something that requires its own RFC? It's a single line change.
>>
>> Jordan
>>
>
> Please do refrain from spreading this FUD. While there are certain
> tradeoffs between choosing emulated or native prepared statements, security
> considerations do not factor into it. There's a very narrow window where
> emulated prepared statements can lead to incorrect escaping (it involves
> picking an exotic non-ASCII-compatible charset, not specifying it in the
> connection DSN, and switching to it at runtime), but it's not something you
> can hit by accident.
>
> Regards,
> Nikita
>
> On Sat, Jul 17, 2021 at 9:48 AM Craig Francis <cr...@craigfrancis.co.uk>
>> wrote:
>>
>> > On Sat, 17 Jul 2021 at 4:05 pm, Marco Pivetta <ocram...@gmail.com>
>> wrote:
>> >
>> > > my belief is that this is not a runtime problem, but rather a
>> type-level
>> > > issue with tainted/untainted input/output.
>> > >
>> >
>> >
>> > Thank you for the feedback Marco,
>> >
>> > As you appreciate, I don’t believe we can get every PHP developer to use
>> > Static Analysis. It’s an extra step that developers with less time,
>> energy,
>> > or care, will not setup and use.
>> >
>> > Putting something in the base language, means that libraries can just
>> use
>> > it, and people using the sites/systems of rushed or lazier developers
>> will
>> > have these checks helping keep their data secure. Data breeches can have
>> > life-changing consequences for people, Injection Vulnerabilities are
>> one of
>> > the biggest causes of them, and since we have the ability for libraries
>> to
>> > warn all developers about these mistake, we should.
>> >
>> > At the moment our house can catch on fire and we don’t even have a smoke
>> > alarm. This is the smoke alarm. And there are reasons why it’s builders
>> and
>> > landlords that have to install them, and we don’t rely on the tenants
>> going
>> > and sorting them out themselves. Because if they don’t, for the best or
>> the
>> > worse reasons, either way there are severe consequences to everybody.
>> >
>> > In regards to Taint Checking, it has a significant problem as it
>> creates a
>> > false sense of security, hence these examples in the RFC:
>> >
>> > $sql = 'SELECT * FROM users WHERE id = ' .
>> $db->real_escape_string($id); //
>> > INSECURE
>> >
>> > $html = "<img src=" . htmlentities($url) . " alt='' />"; // INSECURE
>> >
>> > $html = "<a href='" . htmlentities($url) . "'>..."; // INSECURE
>> >
>> > Fortunately Psalm has just implemented the is_literal() concept, so
>> those
>> > developers who do use Psalm can protect themselves from these issues:
>> >
>> > https://github.com/vimeo/psalm/releases/tag/4.8.0
>> >
>> >
>> >
>> > In addition to that, a mechanism to un-taint values is missing,
>> > >
>> >
>> >
>> > That’s the main flaw with Taint Checking, because it’s not possible to
>> mark
>> > something as safe without knowing about the context. As in, developers
>> use
>> > an escaping function (to mark as untainted), think the value is now
>> “safe”,
>> > and incorrectly use that value in a way that causes a security
>> > vulnerability.
>> >
>> > is_literal() simplifies this problem considerably, by just identifying
>> > developer defined strings, and instead using libraries to handle user
>> > values.
>> >
>> > Craig
>> >
>>
>

Reply via email to