Запустить файл python с помощью API запроса на получение фляги

Код работает. Пересмотрите и порекомендуйте лучшие практики.

Чего я пытаюсь достичь.

  1. API с Flask, который запускает любой файл Python из текущего каталога.

  2. Запустите файл и получите вывод в формате JSON

Ниже приведен код для app.py

from flask import Flask,jsonify
from flask_restful import Api,Resource
import os

app = Flask(__name__)
api = Api(app)

class callApi(Resource):
    def get(self,file_name):
        my_dir = os.path.dirname(__file__)
        file_path = os.path.join(my_dir, file_name)
        file = open(file_path)
        getvalues={}
        exec(file.read(),getvalues)
        return jsonify({'data':getvalues['total']})

api.add_resource(callApi,"/callApi/<string:file_name>")

if __name__ == '__main__':
   app.run(debug='true')

Ниже приведен код для main.py, который отправляет запрос API. С именем файла, которое нужно запустить. Имя файла будет изменено в соответствии с требованиями.

import requests

BASE = 'https://127.0.0.1/callApi/runMe.py'

response = requests.get(BASE)
print(response.encoding)

Ниже приведен файл, который запускается exec из API. API / app.py может получить доступ к этому файлу, потому что оба находятся в одном каталоге.

def fun():
    a = 10
    b = 10 
    total = a+b
    print(total)
    return total
 
total = fun()

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

Оценка функции

Функция Exec

Exec Docs

Запуск сценария Python, сохраненного на локальном компьютере из листов Google, при нажатии кнопки

1 ответ
1

Если честно, этот код выглядит довольно опасным. exec опасен сам по себе, и его использование в сочетании с вводом, вводимым пользователем, создает взрывоопасную комбинацию.

Один недостаток — это обход пути уязвимость. Например, указав имя файла вроде «../root/something/script.py», я смогу вызывать файлы вне вашего каталога. Файл должен существовать, чтобы его можно было запустить, но хакер может найти какой-то файл, лежащий в вашей системе, который можно использовать так, как вы не предвидели.

Ваш скрипт также не проверяет, что полученный путь действительно существует (для этого просто используйте os.path.exists). Таким образом, проверка пользовательского ввода отсутствует.

И, вероятно, этот код можно использовать способами, о которых я не думал.

Но поскольку вы читаете файлы из определенного каталога, вы можете просто запустить каталог этого места, используя, например, os.scandir функция, а затем вы можете создать белый список файлов, которым разрешено запускать. Все остальное следует категорически запретить.

Лично я бы отказался от такого подхода. Было бы лучше создать библиотеку функций и вызывать только известные и понятные функции, а не произвольные файлы. Эмпирическое правило заключается в том, что пользовательскому вводу нельзя доверять, поэтому его необходимо тщательно проверять.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *