On Sat, May 8, 2021 at 8:21 AM Richard Damon <rich...@damon-family.org> wrote: > > On 5/7/21 5:56 PM, 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. > > > > Nick > > > I think the issue is what would the result of the i-string actually be? > The database APIs want typically a string + a tuple or a dictionary, two > seperate things. Are you suggesting that to use i-stings, all the API's > need to be adjusted to accept some new type of object that is a > string/dictionary combo? >
That would be the case, yes. An i-string would have to return a single object (because every expression in Python is a single object), so anything that's expecting two parameters would need to learn how to handle that. That's a small consideration, though. People can always create their own small wrappers, eg: def sql(istring): return cursor.execute(istring.base, istring.vars) or something like that. And APIs can be enhanced over time, with i-string support being added to more things, same as Pathlib support has been progressively added. +1 on revisiting this. ChrisA _______________________________________________ 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/5LN25VHERQXUJKBBUUPUJFW2YYBNSI25/ Code of Conduct: http://python.org/psf/codeofconduct/