Как экранировать символы перед вставкой в sql-запрос?
Здравствуйте! Имеется довольно большой raw sql-запрос в приложении flask. Имеется ORM SQLAlchemy, но, как я и сказал, запрос слишком большой, чтобы писать его средствами орм, да и к тому же текст запроса собирается "на лету" в зависимости от разных условый. Для избежания SQL-инъекций требуется экранировать символы, содержащиеся в переменных, перед вставкой в запрос. Как это можно сделать? Возможно есть ещё какие-то варианты как собрать и выполнить запрос? Переменные вставляются в запрос обычной конкатенацией строк.
Если есть возможность, все-таки лучше пользоваться ORM, хотя бы просто чтобы не смешивать код SQL и питона. Я сейчас как раз вожусь с SQLAlchemy и динамически составляемыми запросами, киньте сюда пример, может что-то придумается.
Собирайте строку и вместо переменных пишите %, попутно собирая список переменных, потом через execute выполняйте, orm сделает все сама. В драйвере Mysql для python есть функция escape_string(), если у вас так прямо все тяжело.
Never, never, NEVER use Python string concatenation (+) or string parameters interpolation (%) to pass variables to a SQL query string. Not even at gunpoint.
А почему Вы не используете связываемые переменные и prepared statements? Такие конструкции сами по себе содержат защиту от SQL-инъекций.