Как я могу защитить свой исходный код при запуске приложения Flask с помощью uWSGI?

#python #flask #pyinstaller #uwsgi

#python #flask #pyinstaller #uwsgi

Вопрос:

У меня есть приложение Flask application, которое я запускаю с помощью uWSGI. Мои клиенты имеют доступ к серверу, на котором выполняется приложение.

Как я могу защитить или скрыть свой исходный код?

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

Комментарии:

1. Зачем вам упаковывать flaskapp в двоичный файл? Логика серверной части и логика шаблонов jinja невидимы для пользователей вашего веб-сайта / serivce. Я не понимаю, почему вы вообще хотите преобразовать его в двоичный файл?

2. Пользователи видят только HTML / CSS / JS, потому что браузеры требуют этого для отображения содержимого

3. @JackofSpades api работает на локальных серверах, которые не являются нашими. Мы не хотим, чтобы наши клиенты имели доступ к нашему исходному коду

4. Может быть, мне следует перефразировать вопрос: как я могу защитить / скрыть свой исходный код при запуске API flask с uWSGI?

5. Если вы хотите быть уверены, что никто не сможет получить ваш код, суть в том, чтобы не передавать свой код ни в каком формате. Это включает в себя доступ к машинам, на которых выполняется ваш код.

Ответ №1:

Правда — если кто-то хочет этого достаточно сильно, единственный способ по-настоящему защитить ваши алгоритмы — не раздавать их. Но реальность такова, что код в любом случае трудно понять. Часто просто не документировать код достаточно, чтобы препятствовать. Однако существуют некоторые методы, и ваши усилия зависят от того, насколько они безопасны. На ум приходят следующие подходы.

  • Компиляция в байт-код: я видел, как это делается в дикой природе, была компания, которая создала почтовый клиент Python для Linux / Outlook. Я помню, что он был запутан через скомпилированный дистрибутив. Вам нужно будет найти подходящий инструмент.

  • Запутывание на уровне каждого скрипта: ознакомьтесь с инструментом pyminifier . Это может сделать ваши скрипты практически невозможными для чтения (но это можно исправить с разумными усилиями)

  • Используйте усовершенствованный обфускатор: посмотрите на pyarmor. Это намного сложнее, и его будет сложнее реализовать, но, похоже, он выполнит свою работу.

  • Откройте исходный код. Кажется нелогичным — но алгоритмы редко являются самым ценным аспектом кода. Наличие навыков, времени, ресурсов для понимания и поддержки — это. Очень вероятно, что не имеет значения, видит ли кто-нибудь ваш код. Если вы предоставляете хороший сервис своим клиентам, у них, как правило, есть дела поважнее, чем использовать вашу кодовую базу. Существует множество корпоративных компаний, зарабатывающих на жизнь с помощью программного обеспечения с открытым исходным кодом (например. Startburst, 2-й квадрант.)

(Пример кода, запутанный с помощью pyminifier)

 import argparse
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐤡=range
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ枇=int
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𧌾=print
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆﶾ=argparse.ArgumentParser
import sys
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𑆉=sys.argv
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𞤌=sys.stdout
import logging
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ닸=logging.basicConfig
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𧄱=logging.DEBUG
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ柚=logging.INFO
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ䔎=logging.getLogger
from demo import __version__
__author__="Steve Jackson"
__copyright__="Steve Jackson"
__license__="mit"
𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐪕=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ䔎(__name__)
def 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡈲(n):
 assert n>0
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ関,𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𒂻=1,1
 for i in 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐤡(n-1):
  𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ関,𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𒂻=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𒂻,𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ関 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𒂻
 return 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ関
def 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐲍(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮):
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆﶾ(description="Just a Fibonacci demonstration")
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ.add_argument("--version",action="version",version="demo-day {ver}".format(ver=__version__))
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ.add_argument(dest="n",help="n-th Fibonacci number",type=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ枇,metavar="INT")
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ.add_argument("-v","--verbose",dest="loglevel",help="set loglevel to INFO",action="store_const",const=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ柚)
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ.add_argument("-vv","--very-verbose",dest="loglevel",help="set loglevel to DEBUG",action="store_const",const=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𧄱)
 return 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆݻ.𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐲍(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮)
def 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐮑(loglevel):
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𗰆="[%(asctime)s] %(levelname)s:%(name)s:%(message)s"
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ닸(level=loglevel,stream=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𞤌,format=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𗰆,datefmt="%Y-%m-%d %H:%M:%S")
def 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆﯜ(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮):
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮=𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐲍(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮)
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐮑(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮.loglevel)
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐪕.debug("Starting crazy calculations...")
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𧌾("The {}-th Fibonacci number is {}".format(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮.n,𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡈲(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𡐮.n)))
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𐪕.info("Script ends here")
def 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆܪ():
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆﯜ(𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆ𑆉[1:])
if __name__=="__main__":
 𒉁ۻ𨠬𧑔ﲮᆖ𪿺𖢞ﻆܪ()
# Created by pyminifier (https://github.com/liftoff/pyminifier)