Можно ли ввести код python в Kwargs и как я могу предотвратить этот пользовательский ввод - PullRequest
0 голосов
/ 31 января 2020

Сейчас я нахожусь в процессе написания диссертации на степень бакалавра и для нее создаю систему баз данных с Postgres и Flask. Чтобы обеспечить безопасность моих данных, я работал над файлом, чтобы предотвратить инъекции SQL, поскольку пользователь должен иметь возможность отправить строку с помощью запроса Http. Поскольку большинство моих функций, которые я использую для анализа запроса Http, используют в запросе Kwargs и dict, основанный на JSON, мне было интересно, возможно ли ввести код python в эти kwargs. И если так, если есть способы предотвратить это.

Чтобы было проще понять, что я имею в виду, вот несколько примеров запросов и код:

def calc_sum(a, b):
    c = a + b
    return c


@app.route(/<target:string>/<value:string>)
def handle_request(target,value):
    if target == 'calc_sum':
        cmd = json.loads(value)
        calc_sum(**cmd)

Пример запроса:

Normal   : localhost:5000/calc_sum/{"a":1, "b":2}
Injected : localhost:5000/calc_sum/{"a":1, "b:2 ): print("ham") def new_sum(a=1, b=2):return a+b":2 }

Поскольку я не рядом с моей работой, где весь мой код, я не могу проверить его. И, честно говоря, мой пример кода будет работать. Но я надеюсь, что это может передать то, что я имел в виду.

Надеюсь, вы поможете мне или, по крайней мере, подтолкнете меня в правильном направлении. Я искал его, но все, что я могу найти, - это учебники о том, «кому использовать kwargs».

С уважением.

1 Ответ

1 голос
/ 31 января 2020

Да, но не в URL, попробуйте использовать подобные аргументы localhost:5000/calc_sum?func=a+b&a=1&b=2

, и для получения этих аргументов вам необходимо сделать это в flask

@app.route(/<target:string>)
def handle_request(target):
   if target == 'calc_sum':
       func= request.args.get('func')
       a = request.args.get('a')
       b = request.args.get('b')
       result = exec(func)

exe c используется для выполнения python кода в строках

...