1

私は Django に比較的慣れておらず、Rails の経験があります。Rails では、 の規則により、通常、ルート (Django のurls.py) をあまり調整する必要はありません。そこで、新しいビューを追加するたびに書き直す必要がないように、自分のプロジェクトに Rails の動作の一部を「インポート」することを考えました。REST/controller/action/indexurls.py

これは私のメインurls.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( django.shortcuts.redirect の理解を参照) が、これらの問題の場合、これが原因ではないようです。とにかく考えさせられましたが、今ではディスパッチャーが最初から良いアイデアであったかどうかはよくわかりません。

また、同僚の一人と、それがあまり好きではないことについて話し合った. 彼は、私が潜在的なセキュリティ リスクをもたらしたと感じたと言いました。誰かがコードの構造を知っていれば、それを悪用できます。彼の主張は私には有効に思えますが、私たちの環境では、(私たち以外の) 誰かが私たちのコードを読む可能性はほとんどありません。

とにかく、Python と Django の経験が豊富な人がそれについてどう思うか知りたいです。

4

1 に答える 1

4

私はあなたの同僚に同意します。urls.py ドキュメントの指示に従って使用してください。

まず、認識された利点について:

urls.pyそこで、新しいビューを追加するたびに書き直す必要がないように、自分のプロジェクトに Rails の動作の一部を「インポート」することを考えました。

「書き直す」必要はありませんurls.py。1行追加する必要があります。この明示的は暗黙的よりも優れたアプローチであり、Python の心臓部を貫くものであり、今それと戦い始めると、同様の問題に直面し続けることになります。

次に、コードにセキュリティ上の問題があります

すぐに、明示的に URL を定義する方が良い — Diaspora (Rails におけるオープンソースの Facebook の競争相手として意図されている) のこのテイクダウンを読んで、自動 URL ルーティングがセキュリティ ホールのギャップにどのように貢献できるかを理解してください。

第二に、設計したバックドアを悪用するためにソース コードを見ることができる必要はありません。ローカル ビュー関数だけでなく、インポートされたすべてのモジュールglobals()が含まれています。攻撃者が 2 つのパラメーターを受け入れる有害な関数 (おそらくモデルの 1 つ、またはそれらをインポートする場合) を見つけられないことを期待するのは危険です。sysos

于 2012-08-13T17:33:13.550 に答える