V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
goodloop
V2EX  ›  Python

一般 Python 服务部署在公有云服务器上,如何做代码保护?

  •  
  •   goodloop · 2017-11-06 15:08:33 +08:00 · 10840 次点击
    这是一个创建于 2356 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果想部署一个 flask 的应用。是直接上项目代码,在 virtualenv 里执行?有没有什么防止代码泄露的方法?
    61 条回复    2017-11-11 13:12:06 +08:00
    jmc891205
        1
    jmc891205  
       2017-11-06 15:12:57 +08:00
    是怕公有云服务商拿走你的代码?
    Hstar
        2
    Hstar  
       2017-11-06 15:16:02 +08:00
    没有.exe
    yuhr123
        3
    yuhr123  
       2017-11-06 15:20:05 +08:00   ❤️ 1
    你真的认为云服务商会看的上你用 flask 框架写的代码?

    如果答案是肯定的,那么恭喜你即将成为下一个独角兽。

    如果答案是否定的,那么恭喜你,创建 virtualenv 环境放心的跑你的代码吧。
    chen2016
        4
    chen2016  
       2017-11-06 15:21:35 +08:00 via Android
    哈哈哈,你的代码那么牛逼的话,你还不自建机房?
    wibile
        5
    wibile  
       2017-11-06 15:23:41 +08:00   ❤️ 1
    有,可以生成.so 文件,直接运行,互相调用也没影响。cython。
    wellsc
        6
    wellsc  
       2017-11-06 15:38:42 +08:00
    @wibile Cython 不支持 Python 的高级语法的(比如说装饰器,元类啥的),而且转换 Python 代码的模块引用也有问题的
    Hellert
        7
    Hellert  
       2017-11-06 15:40:55 +08:00
    这种情况 Go 就体现出优势来了
    mengzhuo
        8
    mengzhuo  
       2017-11-06 16:02:46 +08:00 via iPhone
    @Hellert Go 一样可以反编译~
    wibile
        9
    wibile  
       2017-11-06 16:11:27 +08:00
    @wellsc 支持,引用没问题呢。需要在 linux 上编译,不影响运行,把 xxx.py 替换为 xxx.so ,其他都不变。
    Kilerd
        10
    Kilerd  
       2017-11-06 16:12:19 +08:00
    wheel
    est
        11
    est  
       2017-11-06 16:18:02 +08:00   ❤️ 8
    我跟你们说个邪门的

    等 python 代码跑起来之后,把 .py 删掉即可。

    当然,你们说可以 lsof 在 ln 还原,但是 python 可以远程加载 bytecode 并且执行呀。2333
    wellsc
        12
    wellsc  
       2017-11-06 16:21:34 +08:00
    @wibile 可以,回头我发个 flask 的 gist 片段给你编译试试。我亲测是不可以的
    araraloren
        13
    araraloren  
       2017-11-06 16:38:53 +08:00
    这个时候 perl 的作用就体现出来了吧,我们自带加密 (滑稽
    fiht
        14
    fiht  
       2017-11-06 16:45:48 +08:00
    杞人忧天

    =========
    如果若干年之后有公有云厂商擅自翻用户数据被曝光了请开帖艾特我
    opengps
        15
    opengps  
       2017-11-06 16:49:11 +08:00
    没必要担心这个,就算拿了,等他看懂了用起来,可能数据过时。过时的数据也没意义,公有云自己的业务够忙的,何必对你的代码感兴趣。
    条件是,别选择太小规模的公有云
    mooncakejs
        16
    mooncakejs  
       2017-11-06 16:52:49 +08:00   ❤️ 1
    给你全套阿里巴巴代码,你能跑起来算你赢。
    shiny
        17
    shiny  
       2017-11-06 16:55:09 +08:00
    要是真到了这地步,把数据拷出来再找人重新做一个不就成了。
    rogwan
        18
    rogwan  
       2017-11-06 16:57:04 +08:00 via Android
    @mooncakejs 哈哈😄找个 py 库,没易读的 readme 和 demo 都懒得跑😅
    awing
        19
    awing  
       2017-11-06 18:06:10 +08:00
    大家都那么忙,谁有功夫研究你的代码
    gouchaoer
        20
    gouchaoer  
       2017-11-06 18:09:20 +08:00 via Android
    主要是防着甲方?
    RubyJack
        21
    RubyJack  
       2017-11-06 18:23:27 +08:00
    我觉得 linux 的权限控制就搞定了
    hard2reg
        22
    hard2reg  
       2017-11-06 18:24:32 +08:00   ❤️ 1
    V 站被害妄想症的人起码 90%了
    dzxx36gyy
        23
    dzxx36gyy  
       2017-11-06 18:26:42 +08:00
    公有云一般不搞事吧,最多没事做扫你端口。各种机房托管和租用比较乐于干这种事
    lyragosa
        24
    lyragosa  
       2017-11-06 18:42:17 +08:00
    你怎么不说机房网管直接去机房插个 U 盘把你的数据拷出来呢
    malusama
        25
    malusama  
       2017-11-06 18:44:10 +08:00
    独角兽啊
    ranleng
        26
    ranleng  
       2017-11-06 19:00:45 +08:00
    难道重点不是在于 “有没有什么防止代码泄露的方法?”
    而不是代码质量或者别人偷代码的问题。
    clino
        27
    clino  
       2017-11-06 19:04:54 +08:00 via Android
    @est 万一有些延迟 import 的呢
    patrickwhisper
        28
    patrickwhisper  
       2017-11-06 19:09:54 +08:00
    先用 Docker 包装一层,然后在宿主机的 root 权限回收,关闭 Docker 登陆用户使用的权限。
    zjyExcelsior
        29
    zjyExcelsior  
       2017-11-06 19:49:16 +08:00
    cython 编译
    bfbd
        30
    bfbd  
       2017-11-06 21:08:03 +08:00
    可以编译成 pyc。
    python3 -O -m compileall demo

    https://my.oschina.net/bfbd/blog/864310
    est
        31
    est  
       2017-11-06 21:17:41 +08:00
    @clino 你来个例子我看看?
    clino
        32
    clino  
       2017-11-06 22:46:30 +08:00
    @est 比如在函数里写 import 的,那还没执行过第一次的时候就没 import 过,如果这个模块是自己写的,那删掉不就 import 会失败嘛
    gouchaoer
        33
    gouchaoer  
       2017-11-06 22:54:02 +08:00   ❤️ 3
    LS 一群人的观点就有问题,LZ 是来问有没有防止源码泄漏的方案,一群人告诉 LZ 你不需要加密源码,这很奇怪吧
    crab
        34
    crab  
       2017-11-06 23:00:36 +08:00
    @gouchaoer +1。被 1 楼带歪了!
    ngloom
        35
    ngloom  
       2017-11-06 23:16:13 +08:00
    compileall +1
    zoowii
        36
    zoowii  
       2017-11-06 23:25:13 +08:00
    你的数据库比你的代码重要多了
    Osk
        37
    Osk  
       2017-11-06 23:38:04 +08:00 via Android
    对 compileall 编绎整个项目文件夹,加参数把 docstring 等全搞掉,再把.py 删掉,一样能跑,我自己几个小脚本这样玩过没问题。见过一些商用 python 也是一堆 pyc/pyo,入口的 py 文件只是一些引导代码,import pyc 里面的主函数并执行。注意的是编译后的文件和 python 版本相关的,而且实际上听说能反编译
    jiangbingo
        38
    jiangbingo  
       2017-11-06 23:56:16 +08:00
    编译成包文件。
    goodloop
        39
    goodloop  
    OP
       2017-11-07 00:04:43 +08:00
    多谢各位的方案,我这边主要是一些服务性的代码,不需要存数据库。所以相对来说代码安全性会比较重要一些。

    1. 我原来使用过 pyinstaller 打包应用。但是最近新添加了一个依赖库,pyinstaller 的支持会有问题( so 的依赖问题),
    所以来询问各位的答案。之前做过一些研究,看到基本上集中方案:
    1. cython
    2. 修改 python 的解释器,这个部署比较麻烦
    3. pyinstaller 或者 py2exe

    目前的情况下,看起来 cython 是我想用的可选方案。

    2. 一直依赖做些算法和中间件的事情,没有部署过什么后台服务,所以一直对 python/java 的代码安全性方面比较好奇,所以有此一问。
    fyyz
        40
    fyyz  
       2017-11-07 03:54:48 +08:00
    找实习生重构代码
    enrolls
        41
    enrolls  
       2017-11-07 04:10:12 +08:00
    这 2 点应该会有帮助。
    1. 搜:阴阳师:一个非酋的逆向旅程
    2. 搜:python3-cookbook load_modules_from_remote_machine_by_hooks
    est
        42
    est  
       2017-11-07 04:14:24 +08:00
    @clino 那的确会失败。所以你等几乎所有函数都跑过一次内存热了再删。。。。
    Cooky
        43
    Cooky  
       2017-11-07 07:51:26 +08:00 via Android
    居然没人提 nuitka ?
    flyshu
        44
    flyshu  
       2017-11-07 08:13:52 +08:00
    感觉翻代码还不如翻数据库来得方便快捷
    bearqq
        45
    bearqq  
       2017-11-07 08:21:02 +08:00 via Android
    @Cooky flask 应用他可以,但如何前面再加 gunicorn?
    firefox12
        46
    firefox12  
       2017-11-07 08:38:11 +08:00 via iPhone
    阿里爸爸直接删掉用户可执行程序的事情才过去多久啊?
    ctro15547
        47
    ctro15547  
       2017-11-07 08:46:39 +08:00
    如果只是不想被别人看到*.pyc 咯。或者先混淆一下。只要不是什么惊天的功能,谁管你写的是啥。。
    Cooky
        48
    Cooky  
       2017-11-07 09:38:52 +08:00 via Android
    @bearqq 只编译 flask 呗,gunicorn 只是用来 fork 的(误
    feng1234
        49
    feng1234  
       2017-11-07 09:48:26 +08:00
    如果是那种金融交易策略类的程序,还是很有保护的必要,因为这个是公司核心
    Fen2g
        50
    Fen2g  
       2017-11-07 09:55:35 +08:00
    jyf
        51
    jyf  
       2017-11-07 10:05:43 +08:00
    @gouchaoer 这么多人 就你说到点子上了 很明显 楼主是想提防控制了云的甲方
    sagaxu
        52
    sagaxu  
       2017-11-07 10:11:17 +08:00
    修改解释器,在 pyc 文件中有规律的插入一些错误的 opcode,让标准解释器解释不了,标准反编译器工具也逆向不了。如果你的项目真的很值钱,恐怕用汇编写也没用,照样有人能破解,就看值不值得破。
    recall704
        53
    recall704  
       2017-11-07 10:31:14 +08:00
    不怕,我写的代码过几天我自己都看不懂了。

    ^~^
    goodryb
        54
    goodryb  
       2017-11-07 12:45:42 +08:00
    那你就用自己的服务器部署,对外提供 API 接口就好了
    Wicked
        55
    Wicked  
       2017-11-07 21:41:45 +08:00 via iPhone
    你自己编译一个虚拟机,bytecode 改一下,编译成 pyc 执行,还可以写个包管理系统把 pyc 打包进去,方法很多的。但真想要破解还是可以反编译出来的
    ttycode
        56
    ttycode  
       2017-11-08 08:00:49 +08:00 via iPhone
    docker 部署,然后增加自毁脚本,关闭登陆。
    hareandlion
        57
    hareandlion  
       2017-11-08 08:18:53 +08:00 via iPhone
    @est 没有直接或间接被 import 过的 module,还是不会被加载到内存的吧?
    est
        58
    est  
       2017-11-08 09:48:28 +08:00
    @hareandlion 延迟删文件嘛。
    goodloop
        59
    goodloop  
    OP
       2017-11-08 17:57:20 +08:00
    @ttycode 自毁是指删除 docker 的镜像和 container 么?关闭登录是指关闭登录 host 还是 docker container ?
    clino
        60
    clino  
       2017-11-08 21:22:47 +08:00   ❤️ 1
    刚看到一个贴,google: "[CPyUG] 如何导入和运行加密的 Python 脚本"
    cs371332219
        61
    cs371332219  
       2017-11-11 13:12:06 +08:00
    cxFreeze 和 pyInstaller 可以把你的项目打包成二进制文件。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2586 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 04:26 · PVG 12:26 · LAX 21:26 · JFK 00:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.