SQLAlchemy - проблема с session.execute и bindparams - sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) - PullRequest
0 голосов
/ 03 мая 2019

Этот код работает абсолютно нормально, но уязвим для SQL-инъекций ...

### WORKS FINE ###
value = "whatever"
statement = text(f"DROP VIEW {value}")
session.execute(statement)

... поэтому я хочу использовать bindparam(s) для защиты, однако я не могу всю свою жизнь заставить это работать с утверждением DROP VIEW, которое я дал выше.

### DOES NOT WORK ###
value = "whatever"
statement = text("DROP VIEW :value").bindparams(bindparam("value", String))
session.execute(statement, { "value": value })

ERROR

Traceback (most recent call last):   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1236, in _execute_context
    cursor, statement, parameters, context   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 536, in do_execute
    cursor.execute(statement, parameters) sqlite3.OperationalError: near "?": syntax error

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/some_directory/some_file.py", line 10, in _do_sql
    result = session.execute(statement, { "value": value })   File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/orm/session.py", line 1263, in execute clause, params or {}   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 980, in execute
    return meth(self, multiparams, params)   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 273, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1099, in _execute_clauseelement
    distilled_params,   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1240, in _execute_context
    e, statement, parameters, cursor, context   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1458, in _handle_dbapi_exception
    util.raise_from_cause(sqlalchemy_exception, exc_info)   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 296, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 276, in reraise
    raise value.with_traceback(tb)   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1236, in _execute_context
    cursor, statement, parameters, context   
  File "/some_directory/venv/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 536, in do_execute
    cursor.execute(statement, parameters) 
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) near "?": syntax error [SQL: 'DROP VIEW ?'] [parameters: ('whatever',)] (Background on this error at: http://sqlalche.me/e/e3q8)

Сначала я подумал, что неправильно понял синтаксис или механику, но я в состоянии заставить вещи работать с предложением WHERE очень хорошо.

### WORKS FINE ###
value = "whatever"
statement = text("SELECT * FROM tbl WHERE column = :value").bindparams(bindparam("value", String))
result = session.execute(statement, { "value": value })

Возможно, SQLAlchemy просто не предназначен для такой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...