-
Notifications
You must be signed in to change notification settings - Fork 14.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: adds the ability to disallow SQL functions per engine #28639
fix: adds the ability to disallow SQL functions per engine #28639
Conversation
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #28639 +/- ##
===========================================
+ Coverage 60.48% 83.43% +22.94%
===========================================
Files 1931 523 -1408
Lines 76236 37605 -38631
Branches 8568 0 -8568
===========================================
- Hits 46114 31377 -14737
+ Misses 28017 6228 -21789
+ Partials 2105 0 -2105
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
logger.debug("Query %d: Running query: %s", query_id, sql) | ||
|
||
try: | ||
cls.execute(cursor, sql, query.database) | ||
with app.app_context(): | ||
cls.execute(cursor, sql, query.database) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
threads don't have an app context: https://stackoverflow.com/questions/72541670/why-flask-app-context-is-lost-in-child-thread-when-application-factory-pattern-i
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, interesting.
logger.debug("Query %d: Running query: %s", query_id, sql) | ||
|
||
try: | ||
cls.execute(cursor, sql, query.database) | ||
with app.app_context(): | ||
cls.execute(cursor, sql, query.database) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh, interesting.
:param function_list: The list of functions to search for | ||
:param engine: The engine to use for parsing the SQL statement | ||
""" | ||
return ParsedQuery(sql, engine=engine).check_functions_exist(function_list) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We (probably me) will have to convert this to use sqlglot
and the SQLStatement
class (#26786) but I'm happy to do it, seems simple enough.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Happy to do it myself, can I just not use sqlparse? implement something using the same pattern as extract_tables_from_statement
?
# A set of disallowed SQL functions per engine. This is used to restrict the use of | ||
# unsafe SQL functions in SQL Lab and Charts. The keys of the dictionary are the engine | ||
# names, and the values are sets of disallowed functions. | ||
DISALLOWED_SQL_FUNCTIONS: dict[str, set[str]] = { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm unsure where the best place for this deny list, i.e., here in the configuration or within the extra JSON payload of the database.
Additionally should this be engine (dialect) specific or database specific? If it's the later then maybe the extra JSON payload field is preferable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JSON payload at the database level is more dynamic and would avoid having to change the config to add remove disallowed functions. But on the other hand the user that actually registers the db could have intentions to "abuse" these functions.
SUMMARY
Adds a new configuration key named
DISALLOWED_SQL_FUNCTIONS
that defines disallowed function per engine on SQL statements. These functions will be disallowed on SQLLab and Charts.BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
TESTING INSTRUCTIONS
ADDITIONAL INFORMATION