6

Django docsを引用するには:

@sensitive_post_parameters('pass_word', 'credit_card_number')
def record_user_profile(request):
    UserProfile.create(user=request.user,
                       password=request.POST['pass_word'],
                       credit_card=request.POST['credit_card_number'],
                       name=request.POST['name'])

上記の例では、pass_word および credit_card_number POST パラメーターの値は非表示になり、エラー レポート内の要求の表現で星 ( ****** ) に置き換えられますが、name パラメーターの値は公開されます。

エラー レポートでリクエストのすべての POST パラメータを体系的に非表示にするには、sensitive_post_parameters デコレータに引数を指定しないでください。

@sensitive_post_parameters()
def my_view(request):
    ...

テストとして、次のコードを Django 1.6 アプリケーションに追加しました。

ビュー.py:

@sensitive_post_parameters('sensitive')
def sensitive(request):
    if request.method == 'POST':
        raise IntegrityError(unicode(timezone.now()))
    return render(request, 'sensitive-test.html',
          {'form': forms.SensitiveParamForm()})

フォーム.py:

class SensitiveParamForm(forms.Form):
    not_sensitive = forms.CharField(max_length=255)
    sensitive = forms.CharField(max_length=255)

このフォームを 経由POSTで送信すると、両方のフィールド ( を含むsensitive) の値が Sentry レポートで日として明確に表示されます。

ここで何が間違っていますか?Django 1.6 と Raven 3.5.2 を使用しています。

よろしくお願いします。

4

1 に答える 1

7

これは、Django 自体のバグが原因であることが判明しました。

ファイルを変更DEFAULT_EXCEPTION_REPORTER_FILTERしていない場合は、デフォルトのフィルタ.settingsSafeExceptionReporterFilter

sensitive_post_parametersデコレータを使用した場合、呼び出しSafeExceptionReporterFilter元のget_post_parametersメソッドは次のようになります。

 def get_post_parameters(self, request):
        """
        Replaces the values of POST parameters marked as sensitive with
        stars (*********).
        """
        if request is None:
            return {}
        else:
            sensitive_post_parameters = getattr(request, 'sensitive_post_parameters', [])
            if self.is_active(request) and sensitive_post_parameters:
                cleansed = request.POST.copy()
                if sensitive_post_parameters == '__ALL__':
                    # Cleanse all parameters.
                    for k, v in cleansed.items():
                        cleansed[k] = CLEANSED_SUBSTITUTE
                    return cleansed
                else:
                    # Cleanse only the specified parameters.
                    for param in sensitive_post_parameters:
                        if param in cleansed:
                            cleansed[param] = CLEANSED_SUBSTITUTE
                    return cleansed
            else:
                return request.POST

上記の問題は、機密パラメーターが( )に設定された a正しく返す一方で、 を変更しないことです。QuerySetPOSTCLEANSED_SUBSTITUTE'********************'request.body

get_data_from_requestこれは、Django の Raven/Sentry を使用する場合の問題です。Raven の最初のメソッドがからDjangoClientリクエストのPOSTパラメータを取得しようとすることが判明したためrequest.bodyです。

def get_data_from_request(self, request):

  [snip]

    if request.method != 'GET':
        try:
            data = request.body
        except Exception:
            try:
                data = request.raw_post_data
            except Exception:
                # assume we had a partial read.
                try:
                    data = request.POST or '<unavailable>'
                except Exception:
                    data = '<unavailable>'
    else:
        data = None

 [snip]

DjangoClient最速の修正は、サブクラス化と、その出力をQuerySetによって生成されたクレンジングされたものに手動で置き換えるだけであることが判明しましたSafeExceptionReporterFilter

from django.views.debug import SafeExceptionReporterFilter
from raven.contrib.django.client import DjangoClient


class SafeDjangoClient(DjangoClient):

  def get_data_from_request(self, request):
    request.POST = SafeExceptionReporterFilter().get_post_parameters(request)
    result = super(SafeDjangoClient, self).get_data_from_request(request)
    result['sentry.interfaces.Http']['data'] = request.POST
    return result
于 2014-05-31T05:07:57.537 に答える