Комментарии 11
SQL = f'''select * from tm_schema.task_manager_user'''.format(created_user)
Прям вот так вот, без санитайзинга? Я не особо шарю, но разве так нормально делать параметризированные запросы в базу? В доках вроде рекомендуют по-другому
Добрый день!
Вопрос интересный, автор взял время чтобы разобраться в нём.
Ну словить sql-injection при таком подходе точно можно. Лень проверять на вашем коде, ссылки на репу нет. Но вот простейший пример (утрированный, но всё же):
Click me
from flask import Flask, request
from flask_wtf import FlaskForm
from wtforms import StringField
from flask import render_template
import psycopg2 as pg
import pandas as pd
conn_param = f'host=localhost port=5432 dbname=test user=test'
conn = pg.connect(conn_param)
class Config(object):
SECRET_KEY = 'so secret'
app = Flask(__name__)
app.config.from_object(Config)
class FooForm(FlaskForm):
name = StringField('Name')
@app.route('/', methods=["GET", "POST"])
@app.route('/index')
def index():
form = FooForm()
if form.validate_on_submit():
do_sql(form.name.data)
return render_template('index.html', form=form)
def do_sql(name):
query = "select * from test where name='{name}'".format(name=name)
print(query)
res = pd.read_sql_query(query, conn)
print(res)
if __name__ == "__main__":
app.run()
Запускаем, вводим `not_exist' or ''='` и внезапно можем получить список всех пользователей, вместо одного.
Ну и вообще, вы вроде профессиональное сообщество, но весь код максимум любительский, там целая куча проблем
Добрый день, спасибо за вопрос!
Вы правы, лучше всего использовать примеры из документации.
Если проект продолжит развиваться, то я обязательно переработаю формат запросов, дополнительно разобрав защиту от sql инъекций.
На данном момент использовать такой формат запросов считаю уместным только в качестве примера для демонстрации логики.
А global разве не плохая практика использовать?
Хотела бы познакомиться с task manager'ом, когда будет свободный доступ и инструкция для настройки задачника.
Статья написана джуном с опытом в >10 лет?
class Config(object):
Устаревший способ создания класса
os.environ.get('SECRET_KEY') or 'never-gonna-give-you-up'
Вы не знаете, как пользоваться dict.get
?!
К тому же использование flask в 2023... Тем более синхронного... Да и запросы без санитайзинга/аргументов... Это я даже дальше читать не стал. Статья не тянет даже на туториал для начинающих - скорее приучаете делать так, как не нужно
Разработка task manager при помощи библиотек Flask и psycopg2