this is the only proper way, and it relies on the underlying driver implementation.
On Tuesday, September 13, 2016 at 5:08:30 PM UTC+2, Lisandro wrote: > > Thank you Niphlod. > I've seen that db.executesql receives the "placeholders" argument in order > to do the escaping. > I've modified my code to this: > > def search(): > results = db.executesql('SELECT * FROM contenido WHERE tsv @@ > plainto_tsquery(%s)', placeholders=[request.vars.q]) > return dict(results=results) > > *Can you confirm that this is the proper way to do it? * > I couldn't find much documentation about that, just this: > > - http://web2py.com/books/default/chapter/29/6#executesql > - > > https://groups.google.com/forum/#!searchin/web2py/executesql$20placeholders$20escape%7Csort:relevance/web2py/kblhrTsVW6M/2vJ_afgty34J > > > Thanks in advance! > > > > El martes, 13 de septiembre de 2016, 6:51:55 (UTC-3), Niphlod escribió: >> >> app/controller/function&q=everythingyoucanthinkof . >> >> NEVER . EVER. EVER. build queries without proper escaping. >> >> On Monday, September 12, 2016 at 3:12:50 PM UTC+2, Lisandro wrote: >>> >>> Hi there! >>> I have a simple view with a form (with GET method), in order to allow my >>> visitors to do some search. >>> The controller/function that processes the get is this: >>> >>> def search(): >>> session.forget(response) >>> query = "tsv @@ plainto_tsquery('%s')" % request.vars.q >>> total = db.executesql('SELECT COUNT(*) FROM contenido WHERE %s' % >>> query) >>> results = db(query).select() >>> return dict(results=results) >>> >>> As you can see, I use a tsv field to implement postgresql full text >>> search. The funcion is working ok. >>> But *yesterday, I had an attack attempt*, or something like that. In >>> just one hour, some robot sent a lot of queries to that URL, putting >>> "garbage" in the "q" parameter. >>> >>> How did I notice that? Well, *in just one hour around 500 error tickets >>> were created* in the /errors folder. All the errors have this form: >>> >>> - unterminated quoted string at or near >>> "'../../../../../../../../../../windows/win.ini" LINE 1: ...tsv @@ >>> plainto_tsquery('../../../... ^ >>> - unterminated quoted string at or near >>> "'1some_inexistent_file_with_long_name" LINE 1: ...tsv @@ >>> plainto_tsquery('1some_ine... ^ >>> - unterminated quoted string at or near >>> "'../../../../../../../../../../etc/passwd" LINE 1: ...tsv @@ >>> plainto_tsquery('../../../... ^ >>> - invalid byte sequence for encoding "UTF8": 0xf0 0x20 0x20 0xf0 >>> - invalid byte sequence for encoding "UTF8": 0xf6 0x22 0x20 0x6f >>> - invalid byte sequence for encoding "UTF8": 0xa0 >>> >>> >>> *I've already tried to use the search form with those query strings, but >>> I cannot reproduce the error.* >>> *How could the robot send those bytes to the query function?* >>> >>> Of course I can add a try: except: block, however I was wondering how to >>> reproduce the error, I wasn't able to do it. >>> Any help will be appreciated. >>> >>> Thanks in advance! >>> Regards, >>> Lisandro. >>> >> -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.