Python中具有私有元素的公共API

时间:2009-11-03 10:37:34

标签: python security api class pipe

我正在开发Web地图服务,并希望为我的用户提供可用于创建自定义插件的Python API。这些插件将在我的服务器上运行,所以我试图尽可能地锁定Python。

为了确保用户无法访问他们不应该访问的文件,我打算在PyPy沙盒解释器中运行插件。

我正在努力克服的最后一个障碍是如何克服API本身。我有一个数据库API,允许用户对数据库进行受控查询。例如,我有一个select(column,condition)函数,允许用户从数据库中检索项目,但它们将被限制在一个表中。然后,有一个私有函数_query(sql),它接受​​原始SQL命令并在服务器上执行它们

问题在于Python(至少据我所知)没有办法阻止用户直接调用查询函数并调查我的数据库。为了防止这种情况,我想把我的API分成两部分:

-------------   pipe   --------------      ------------
| publicAPI | -------> | privateAPI | ---> | database |
-------------          --------------      ------------

因此,publicAPI基本上是通过管道与主API通信的代理API。 publicAPI只包含公共API函数的代理,用户将无法获取私有元素(例如_query(sql))。

您认为这是一个可行的解决方案吗?我是否通过忽略更简单的解决方案为自己做了太多的工作?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

这看起来像是一种干净的方式来实现这一点。我相信它有时也被称为“Facade”设计模式。

在python中,使用显式方法委派(一个简短的片段给你一个大致的想法)很容易实现:

class FacadingAPI():
    def __init__(fullapi_instance):
        self.select = fullapi_instance.select # method delegating
        ...

答案 1 :(得分:0)

有很多方法可以做到这一点。我倾向于有一个包含所有可用函数名的元组,然后检查被调用的函数是否在元组中,如果没有则抛出错误。

e.g。

funcs = ("available","functions","here")

if (calledFunction in funcs):
  #do something
else:
  #throw error

或者您可以采用谷歌在其App Engine页面上的方法

http://code.google.com/appengine/articles/rpc.html