代码之家  ›  专栏  ›  技术社区  ›  Pablo

我不确定我目前的urls.py设计

  •  1
  • Pablo  · 技术社区  · 13 年前

    我对Django还比较陌生,并且有使用Rails的经验。在Rails中,你通常不需要调整太多的路由(Django的 urls.py )因为 REST 的公约 /controller/action/index 。所以我想为我的项目“导入”Rails的一些行为,这样我就不必重写 网址.py 每次我添加新视图时。

    这是我的主菜 网址.py 文件

    from django.conf.urls import patterns, include, url
    from django.views.generic.simple import redirect_to
    
    urlpatterns = patterns('',
            url(r'^$', redirect_to, {'url': '/monitor/'}),
            url(r'^monitor/', include('monitor.urls')),
    )
    

    在里面 monitor/urls.py ,我有

    from django.conf.urls import patterns, include, url
    urlpatterns = patterns('monitor.views',
            (r'^$', 'dispatcher'),
            (r'^(?P<action>\w+)/(?P<id>.*$)', 'dispatcher'),
    )
    

    还有我的 monitors.views.dispatcher 函数看起来像

    def dispatcher(request, action=None, id=None):
        if action == None:
            action = "index"
    
        try:
            act_func = globals()[action]
        except KeyError, e:
            return HttpResponseNotFound("No %s action defined. Page not found." % (action))
    
        return act_func(request, id)
    

    我在 redirect (参见 Understanding django.shortcuts.redirect )但这似乎不是这些问题的根源。无论如何,这让我思考,现在我不太确定我的调度员一开始是否是个好主意。

    我还和我的一位同事讨论了一下,他不太喜欢。他说他觉得我带来了潜在的安全风险。如果有人知道代码的结构,那么你就可以利用它。虽然他的论点在我看来是有效的,但在我们的环境中,不太可能有人(除了我们自己)阅读我们的代码。

    无论如何,我想知道对Python和Django更有经验的人对此有何看法。

    1 回复  |  直到 8 年前
        1
  •  4
  •   supervacuo    13 年前

    我同意你同事的看法。你应该使用 urls.py following the instructions in the documentation

    首先,关于感知优势:

    所以我想为我的项目“导入”Rails的一些行为,这样我就不必重写 网址.py 每次我添加新视图时。

    你永远不必“重写” 网址.py “;您必须添加一行。这种显式方法比隐式方法运行要好 right to the heart of Python ,如果你现在开始与之斗争,你将继续遇到类似的问题。

    第二 您的代码存在安全问题。

    马上,最好明确定义URL来读取 take-down of Diaspora (打算作为Rails中的开源Facebook竞争对手),了解自动URL路由如何导致巨大的安全漏洞。

    其次,不需要能够看到源代码就可以利用您设计的后门。 globals() 不仅仅包含本地视图函数,它还包含 所有导入的模块 。希望攻击者找不到破坏性函数是危险的(可能是在您的某个模型上,或者 sys os 如果您导入这些),它接受两个参数。