Как стать автором
Обновить

Комментарии 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 инъекций.

На данном момент использовать такой формат запросов считаю уместным только в качестве примера для демонстрации логики.

Просто возьмите Streamlit. Все мучения с ручным написанием HTML уйдут, и от Flask заодно отказаться можно.

Добрый день, спасибо за комментарий!

Ранее ничего не слышал о данном фреймворке, streamlit оказался довольно занимательным инструментом. Если вариант задачника на Flask не выстрелит, то попробую сделать решение на streamlit'е.

А global разве не плохая практика использовать?

Добрый день!

Вы правы, идея использовать global была не самой лучшей.

Сейчас собираю обратную связь и буду проводить code review, чтобы такие моменты исправлять.

Хотела бы познакомиться с task manager'ом, когда будет свободный доступ и инструкция для настройки задачника.

Добрый день, если дадут добро на размещение, то проект в немного изменённом виде появится на github.

Статья написана джуном с опытом в >10 лет?

class Config(object):

Устаревший способ создания класса

os.environ.get('SECRET_KEY') or 'never-gonna-give-you-up'

Вы не знаете, как пользоваться dict.get?!

К тому же использование flask в 2023... Тем более синхронного... Да и запросы без санитайзинга/аргументов... Это я даже дальше читать не стал. Статья не тянет даже на туториал для начинающих - скорее приучаете делать так, как не нужно

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории