运行 R 脚本并对用户隐藏实际代码

Vam*_*kos 3 r rscript

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

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

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

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

r2e*_*ans 8

前面

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

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

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

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

背景

几种(许多?)编程语言提供了将脚本或程序编译为可执行文件(您参考的)的能力.exe。例如,python 有py2exe和等工具PyInstaller。这些工具的范围很广,从仅仅将脚本压缩成一个压缩包,也许会混淆脚本;...实际创建一个exe带有紧密嵌入的脚本等的脚本。(这部分可以使用更多的引用/研究。)

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

不幸的是,没有任何工具可以轻松地为 R 完成此操作。

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

约束R.exe

有一些问题(在其他地方?)询问他们是否可以修改 R 解释器本身,以便它不会执行其预期执行的所有操作。例如,可以base::print以这样一种方式重新定义,即函数的内容不能被转储,并且debug不显示它将要执行的代码,以及可能的其他几个保护步骤。

这种方法存在一些问题:

  1. 总是有另一种方法来获取函数的内容。即使您停止print.default并且debug蒙古包不这样做,还有其他方法可以访问这些功能(body(.)其中之一)。您认为您能准确地遍历多少个兔子洞,将它们全部获取……而不会对正常的 R 代码产生不利影响

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

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

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

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

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

备择方案

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

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

  • 闪亮的应用程序,自托管(或者在shinyapps.io上,如果你相信他们的安全性);服务器包括Shiny Server(免费版和商业版)、RStudio Connect(仅限商业版)和ShinyProxy。(据了解,该列表并不具有排他性。)

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

  • 预留。我对此知之甚少,但从我的经验来看,我在与企业系统集成方面没有那么幸运(例如,身份验证和对授权的精细控制很重要)。这确实允许对 R 进行近乎原始的访问,因此它可能不是您想要的(特别是当目的是向本身可能不是强 R 用户的客户提供时)。

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

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

  • 哇,考虑提供赏金来给这个问题加分。 (3认同)