(PEP 501 is titled "General purpose string interpolation")

It's unlikely that the SC would reconsider PEP 501 as-is.

Probably the best way forward is to consider the existing PEP 501 as food
for thought, and write up a new proposal that aims to solve some of the
same problems in a way that avoids the issues that led to PEP 501's
deferral.

In particular, I'd read the Rationale and Discussion section of that PEP
carefully before trying to come up with a new proposal.

On Fri, May 21, 2021 at 1:09 PM Nick Humrich <n...@humrich.us> wrote:

> This thread kind of took a turn to bikeshed, and thats probably my fault,
> I apologize.
>
> I would like to get back to the original question which is, can we revisit
> PEP 501? What can I do to get this to happen? What is the process for
> revisiting existing deferred PEPs?
>
> Nick
>
> On Sat, May 8, 2021 at 4:02 AM M.-A. Lemburg <m...@egenix.com> wrote:
>
>> On 07.05.2021 23:56, Nick Humrich wrote:
>> > Marc,
>> >
>> > You might have misunderstood me. I am not recommending sending the
>> database raw
>> > strings without parameters, but rather that i-strings turn things into
>> > parameters and its impossible to mess up. Let me explain a little.
>> >
>> > In sqlalchemy, you can use a format such as "update items set a=:value
>> where
>> > id=:item_id" then you tell it the value of the parameters. SQLAlchemy
>> then takes
>> > the :something part of the string and turns it into a parameter ($1,
>> $2, etc).
>> > The problem being however, there is nothing stopping me from doing an f
>> string
>> > on accident: f"update items set a={something} where id=:value". Because
>> > f-strings are eager, sqlalchemy cant protect you, you are now
>> vulnerable to
>> > injection.
>> > But with i-strings, because they are not eager, it would actually know
>> that you
>> > passed in the value as a variable, and turn it into a parameter. It
>> knows the
>> > difference between the static part of the query and the dynamic part of
>> the
>> > query, so it can actually protect you from yourself, or protect early
>> engineers
>> > who don't even know what injection is.
>>
>> Thanks for explaining again, Nick, but I still don't follow you.
>>
>> The templating language used for binding parameters to the
>> SQL strings is not defined by Python, it's defined by the various
>> database backends you are using, so i-strings won't help if you
>> already do the right thing, which is to keep the SQL strings and
>> the parameters separate :-)
>>
>> Now, you could suggest that database interfaces should only accept
>> i-strings as statement input, preventing the eager formatting
>> that takes place with f-strings, but that would just use i-strings
>> as a container for "don't format this string content before
>> sending it to the database".
>>
>> This would only mildly help, though, since the {}-syntax used
>> by i-strings (and f-strings) is not common with database engines
>> (I don't know of any engine which accepts this syntax).
>>
>> The point I wanted to make is that i-strings do have advantages
>> based on the late binding, but SQL injection protection is not
>> necessarily the most important one.
>>
>> Aside: Note that even with proper use of binding parameters in
>> SQL strings, you often still need to use Python templating on
>> these, since not all parts of the SQL strings can be templated
>> using binding parameters. E.g. table names are usually not
>> allowed to the templated in SQL strings by the databases, the
>> reason being that the query plans rely on these names.
>>
>> > Nick
>> >
>> >
>> > On Fri, May 7, 2021, 2:48 PM M.-A. Lemburg <m...@egenix.com
>> > <mailto:m...@egenix.com>> wrote:
>> >
>> >     On 07.05.2021 22:39, Ram Rachum wrote:
>> >     > Hi Marc.
>> >     >
>> >     > On Fri, May 7, 2021 at 11:32 PM M.-A. Lemburg <m...@egenix.com
>> >     <mailto:m...@egenix.com>
>> >     > <mailto:m...@egenix.com <mailto:m...@egenix.com>>> wrote:
>> >     >
>> >     >     On 07.05.2021 21:40, Nick Humrich wrote:
>> >     >     > PEP 501 was deferred because more learning and time was
>> wanted after
>> >     >     introducing
>> >     >     > f-strings. Now that it has been 5 years, I wonder what the
>> >     possibilities of
>> >     >     > revisiting PEP 501 are.
>> >     >     >
>> >     >     > I recently had the experience of using javascript "tagged
>> template
>> >     >     literals" and
>> >     >     > was able to build a SQL string parser that is impossible to
>> have SQL
>> >     injection
>> >     >     > with. This is done by having the database connection object
>> only
>> >     accept a
>> >     >     > certain type of object, and all sql tagged template
>> literals become that
>> >     >     object.
>> >     >     > Because variables are lazy evaluated, the template function
>> can turn all
>> >     >     dynamic
>> >     >     > inputs into parameters in a SQL query. It is impossible for
>> a dev to
>> >     >     > accidentally add a user imputed string as a literal.
>> >     >     > PEP 501 already mentions how templates (i-strings?) can
>> solve injection.
>> >     >     This is
>> >     >     > a very incredible goal. Injection has been the #1
>> vulnerability on
>> >     OWASP for
>> >     >     > over 10 years, and has been in the top 5 the entire time
>> OWASP has
>> >     existed
>> >     >     > (almost 20 years now).
>> >     >     > We have an opportunity to completely remove injection
>> attacks.
>> >     >
>> >     >     I think you ought to not use SQL injection as the primary
>> argument
>> >     >     for i-strings.
>> >     >
>> >     >     The DB API highly recommends passing any arguments
>> >     >     to a SQL to the database via binding parameters and let the
>> database
>> >     >     do the binding of the SQL template on the server side.
>> >     >
>> >     >     Sending those SQL templates and the parameters separately to
>> the
>> >     >     database is not only safer, but also a lot more efficient and
>> allows
>> >     >     for the database to much better manage query plan caching and
>> reuse.
>> >     >
>> >     >
>> >     > Interesting. When you do that in Python, does that mean something
>> like %s
>> >     in the
>> >     > SQL query, and then after the query a list of arguments in the
>> same order
>> >     as the
>> >     > %s tokens? Because if that's the case, maybe it'll be better to
>> use an
>> >     i-string
>> >     > there, and NOT have the Python layer format the string, but use
>> that
>> >     i-string to
>> >     > send the parameters separately to the database. It might be
>> easier to read
>> >     that way.
>> >
>> >     The %s tokens in %-formatted SQL strings for e.g. PostgreSQL
>> >     are sent to the database as-is. The binding of the parameters,
>> >     which are passed separately as a tuple, is done by the database
>> >     and not in Python, even though the format looks a lot like the
>> >     %-formatting used in Python.
>> >
>> >     There are other formats as well, e.g. the ? token format
>> >     used in ODBC or the :1 tokens used for e.g. Oracle.
>> >
>> >     See https://www.python.org/dev/peps/pep-0249/#paramstyle for
>> >     details.
>> >
>> >     >     Even with i-strings we should *not* recommend doing the
>> binding
>> >     >     of SQL strings in the Python application.
>> >     >
>> >     >     There are other use cases where lazy binding can be useful,
>> though,
>> >     >     e.g. when you don't know whether the interpolation will
>> actually
>> >     >     get used (logging) or where you may want to render the
>> template
>> >     >     in a different or extended namespace.
>> >     --
>> >     Marc-Andre Lemburg
>> >     eGenix.com
>> >
>> >     Professional Python Services directly from the Experts (#1, May 07
>> 2021)
>> >     >>> Python Projects, Coaching and Support ...
>> https://www.egenix.com/
>> >     >>> Python Product Development ...
>> https://consulting.egenix.com/
>> >
>>  ________________________________________________________________________
>> >
>> >     ::: We implement business ideas - efficiently in both time and
>> costs :::
>> >
>> >        eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
>> >         D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
>> >                Registered at Amtsgericht Duesseldorf: HRB 46611
>> >                    https://www.egenix.com/company/contact/
>> >                          https://www.malemburg.com/
>> >
>> >
>> > _______________________________________________
>> > Python-ideas mailing list -- python-ideas@python.org
>> > To unsubscribe send an email to python-ideas-le...@python.org
>> > https://mail.python.org/mailman3/lists/python-ideas.python.org/
>> > Message archived at
>> https://mail.python.org/archives/list/python-ideas@python.org/message/FXSHIJ5TV6ZRN2D74FEFEGSHTB4LKGQJ/
>> > Code of Conduct: http://python.org/psf/codeofconduct/
>> >
>>
>> --
>> Marc-Andre Lemburg
>> eGenix.com
>>
>> Professional Python Services directly from the Experts (#1, May 08 2021)
>> >>> Python Projects, Coaching and Support ...    https://www.egenix.com/
>> >>> Python Product Development ...        https://consulting.egenix.com/
>> ________________________________________________________________________
>>
>> ::: We implement business ideas - efficiently in both time and costs :::
>>
>>    eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
>>     D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
>>            Registered at Amtsgericht Duesseldorf: HRB 46611
>>                https://www.egenix.com/company/contact/
>>                      https://www.malemburg.com/
>>
>> _______________________________________________
> Python-ideas mailing list -- python-ideas@python.org
> To unsubscribe send an email to python-ideas-le...@python.org
> https://mail.python.org/mailman3/lists/python-ideas.python.org/
> Message archived at
> https://mail.python.org/archives/list/python-ideas@python.org/message/MYKV5BUW4IBSWRDNIUARKAHXM4R5HZO3/
> Code of Conduct: http://python.org/psf/codeofconduct/
>


-- 
--Guido van Rossum (python.org/~guido)
*Pronouns: he/him **(why is my pronoun here?)*
<http://feministing.com/2015/02/03/how-using-they-as-a-singular-pronoun-can-change-the-world/>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/36ZVYYCEOZLOJJWXGSMK2L6FZ7ZLS24B/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to