我们正在创建一个在线平台,并通过嵌入式代码编辑器公开Julia API。用户可以访问API并在我们的Web应用程序上运行一些分析。我有一个与控制对API和对象的访问有关的问题。
API现在包含数据库句柄和向用户公开的其他对象,可用于破解内部系统。
以下是目前的架构:
UserProgram.jl
function doanalysis()
data = getdata()
# some analysis on data
end
InternalProgram.jl
const client = MongoClient()
const collection = MongoCollection(client,"dbname","collectionName")
function getdata()
data = #some function to get data from collection
return data
end
#after parsing the user program
doanalysis()
要运行用户分析,我们将用户程序作为命令行参数传递(使用ArgParse模块)并运行内部程序,如下所示
$ julia InternalProgram.jl --file Userprogram.jl
通过这种架构,用户可以访问"客户端"和"收集"并且可以修改内部数据库。
有没有更好的方法来解决这个问题而不暴露对象?
我希望有人能回答这个问题。
答案 0 :(得分:1)
您将暴露自己的多种类型的漏洞 - 作为一般规则,执行用户输入的代码是一个非常糟糕的想法。
1 / /就像你说的那样,你可能会允许用户对你的数据库执行随机代码。 2 /您的用户将可以访问Julia的所有功能,以便在您的服务器上执行操作(下载他们以后可以执行的文件,例如,访问服务器上的其他服务器和服务[MySQL,电子邮件等])。根据Julia流程的访问级别,考虑未经授权访问您的文件系统,安装密钥记录器,运行垃圾邮件服务器等。 3 /将能够使用Julia软件包并让您遇到很多麻烦 - 例如添加/使用Requests.jl软件包并在其他服务器上执行DoS攻击。如果你真的想这样,我建议:
为配置为在应用程序中使用的MongoDB用户设置适当的(最小)权限(例如:http://blog.mlab.com/2016/07/mongodb-tips-tricks-collection-level-access-control/)
将每个用户的代码执行到一个单独的沙箱/容器中,只显示最低限度的必要软件 让您的容器在托管平台上运行,其中存在工具(防火墙)以监控传入和传出流量(例如阻止垃圾邮件或DoS攻击)为了实现B /和C /我的建议是使用JuliaBox。我自己还没有使用它,但似乎正是你所需要的:https://github.com/JuliaCloud/JuliaBox