【问题标题】:Run R script and hide the actual code from user运行 R 脚本并对用户隐藏实际代码
【发布时间】:2021-04-30 12:14:30
【问题描述】:

我创建了一个 R 代码脚本:

  1. 从数据库中读取一些数据
  2. 进行一些转换并......
  3. 将修改后的表格导出为 csv。

此代码需要在客户端机器上运行,但我们需要对用户“隐藏”实际代码。

对于我们如何实现这一目标有什么有用的建议吗?

【问题讨论】:

  • 这几乎是不可能的。如果您有非常不成熟的用户,您可能可以进行混淆(例如,让他们在本地运行 Shiny 应用程序)。 researchgate.net/post/How_to_make_invisible_the_R_code
  • Vamkos,不幸的是,R 不提供从脚本编译/导出.exe 的能力,这可能与其他一些语言不同。一般而言,从最终用户那里隐藏代码的唯一合理方法是不在他们的计算机上运行 R 的东西。选项:将其作为管道工 API 端点(您必须将其托管在某处)、闪亮的应用程序或 Rserve 运行(尽管在跨网络拓扑中要很好地保护它有点困难)。
  • 一些将 R 代码部署到最终用户而不需要他们了解 R(甚至管理 R 实例)的方法专注于处理安装等,而不是保护正在运行的代码;坚定的用户很可能无需太多努力即可获得完整的源代码。此类努力包括RInnoDesktopDeployR 等。我既不推荐也不反对,只是为了证明大多数努力是在与 IT 挑战用户打交道,而不是好奇的用户。
  • 归根结底,从好奇的用户那里保护 R 代码的唯一合理(当然也是最好的)方法是在您控制的计算机上运行所有基于 R 的处理。
  • 多年来,这个问题已经在不同的场合多次讨论过(可能主要在 R 邮件列表中)。 @r2evans,您可以将您的 cmets 作为规范的 SO 答案发布(假设它已经不在网站上的某个地方......)

标签: r rscript


【解决方案1】:

前面

...几乎不可能将 R <something> 部署到另一台计算机上,以防止好奇的用户访问源代码。

来自 2011 年的邮件列表对话,以回应 “我不希望任何人能够阅读代码。”

R 是一个开源项目,因此为您提供执行此操作的方法并不是 我们的目标之一。

(默多克教授在 R 核心团队和 R 基金会工作多年。)

背景

几种(许多?)编程语言提供将脚本或程序编译成可执行文件的能力,即您引用的.exe。例如,python 有py2exePyInstaller 之类的工具。这些工具的范围从仅仅将脚本压缩成一个压缩球,可能会混淆脚本; ...实际创建一个exe,脚本要么紧密嵌入,要么类似。 (这部分可以使用更多的引用/研究。)

这通常对许多人来说已经足够了,因为它会把诚实的人拒之门外。我这样说是因为你需要做的就是像decompile py2exe 这样的谷歌短语,你会找到工具、howtos、教程等,其意图可能真诚地试图帮助某人恢复丢失的代码.不管意图如何,它们只会减慢好奇的用户。

不幸的是,对于 R 来说,没有任何工具可以轻松做到这一点。

有些工具旨在让非 R 用户更轻松地使用基于 R 的工具。例如,RInnoDesktopDeployR 是两个工具,旨在创建支持 R 或 R/shiny 工具的 Windows(非 mac/linux)安装程序。但此类工具的目的是促进 IT 任务与让用户/客户在他们的计算机上安装和维护 R 相关,而不是保护它运行的代码。

约束R.exe?

有一些问题(在其他地方?)询问他们是否可以修改 R 解释器本身,以便它不会做它打算做的所有事情。例如,可以重新定义 base::print,使函数的内容不能被转储,而 debug 不显示它即将执行的代码,可能还有其他几个保护步骤。

这种方法存在一些问题:

  1. 总是有另一种方法可以获取函数的内容。即使您阻止print.defaultdebugger 这样做,也有其他方法可以使用这些功能(例如body(.))。你觉得你会准确地遍历这些兔子洞中的多少,把它们全部弄下来……对正常的 R 代码没有不利影响

  2. 即使您觉得自己可以获取所有内容,您是否对包含您专有内容的源 .R 文件进行了加密?好的,加密很好,除了你需要以某种方式解密内容。许多具有加密内容的工具这样做是为了阻止逆向工程,因此它们还在应用程序本身中嵌入(当然是模糊的)解密密钥。只要给它时间,有人会找到并提取它。

    您可能认为您可以在启动时下载密钥(不存储在应用程序中),以便实时解密代码。抱歉,网络嗅探器将获取密钥。即使您通过 https:// 检索它,https://mitmproxy.org/ 等工具也会使此步骤的效率大大降低。

  3. 假设您已经重新编译 R 以屏蔽 print 等,有一种方法可以分发加密的源代码,并且能够以不易泄露密钥的方式对其进行解密(用于源代码的完全解密文件)。虽然需要专门的用户通过上述所有步骤来获取源代码,但上述步骤都不是必需的:他们可能会合法地强制您将更改发布到 R 解释器本身(即您防止打印功能内容)。这不会显示您的源代码,但会显示您的许多方法,这可能就足够了。 (或者只是法律费用的风险。)

    R 是 GPL,这意味着任何链接到它的东西也被 GPL “污染”。这意味着使用Rcppfor instance 编译的任何内容也将受到 GPL 的约束/解放(您的选择)。这包括使用RInside 的想法:它也是 GPL (>= 2)。

    要在不涉及 GPL 的情况下完成此操作,您需要在不使用 R 项目代码的情况下编写解释器(可能是从零开始)。

替代方案

最终,如果您想向客户端发布基于 R 的实用程序/应用程序/功能,让他们在不看到代码的情况下使用您的代码的唯一可靠方法是……控制运行 R 的计算机(源代码将驻留)。当我找到它们时,我会添加更多支持此声明的链接,但只是一个小小的开始:

选项包括使 R 代码和 R 解释器完全在您的控制之下的任何内容。简单例子:

  • Shiny 应用程序,自托管(如果您信任他们的安全性,也可以在 shinyapps.io 上);服务器包括Shiny Server(免费版和商业版)、RStudio Connect(仅限商业版)和ShinyProxy。 (该列表不知道是排他的。)

  • Rplumber 是 API 服务器,而不是闪亮的服务器。目的是针对单个 HTTP(s) 端点调用,可能经过身份验证,支持任何 HTTP 支持(发布、获取等)。这可以通过多种方式提供,请参阅其hosting 页面了解选项。

  • Rserve。我对此知之甚少,但从我的经验来看,与企业系统集成的运气不太好(例如,身份验证和对授权的精细控制很重要)。这确实允许对 R 进行近乎原始的访问,因此它可能不是您想要的(尤其是当目的是提供给自己可能不是强大的 R 用户的客户时)。

  • OpenCPU 应该被讨论,但不能作为“保护你的代码”的可行候选者。它与rplumber 非常相似,因为它提供 HTTP 端点,但它支持其 R 库中安装的每个包中的每个导出函数的端点。这包括base 包,因此获取任何可以在 R 控制台上获取的函数的源代码一点都不难。我相信这是一项设计功能,即使它与您保护代码的意图完全不一致。

  • 任何可以调用 R 或 Rscript 的东西。这可能是 PHP 或 mod_python 或类似的。任何可以exec("/usr/bin/Rscript",...) 的网页服务语言都可以获取其输出并将其转交给调用代理。 (例如,PHP 前端也可能调用仅允许来自 PHP 服务主机的连接的 opencpu 端点。)

【讨论】:

  • 哇,考虑提供赏金给这个问题更多的分数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 2014-01-10
  • 2019-07-28
  • 1970-01-01
相关资源
最近更新 更多