diff --git a/raven/contrib/django/client.py b/raven/contrib/django/client.py index 43e73ccae..ba8321840 100644 --- a/raven/contrib/django/client.py +++ b/raven/contrib/django/client.py @@ -15,6 +15,7 @@ from django.http import HttpRequest from django.template import TemplateSyntaxError from django.template.loader import LoaderOrigin +from django.utils.http import urlencode from raven.base import Client from raven.contrib.django.utils import get_data_from_template, get_host @@ -80,6 +81,18 @@ def get_data_from_request(self, request): except Exception: # assume we had a partial read: data = '' + + # hide sensitive data + if hasattr(request, 'sensitive_post_parameters'): + if request.sensitive_post_parameters == '__ALL__': + data = '' + elif data != '': + qs = _urlparse.parse_qs(data) + for param in request.sensitive_post_parameters: + if param in qs: + qs[param] = '' + data = urlencode(qs, doseq=True) + else: data = None @@ -94,6 +107,9 @@ def get_data_from_request(self, request): 'cookies': dict(request.COOKIES), 'headers': dict(get_headers(environ)), 'env': dict(get_environ(environ)), + 'sensitive_post_params': + request.sensitive_post_parameters and + request.sensitive_post_parameters or False } }) diff --git a/raven/processors.py b/raven/processors.py index 224dc1d47..134c1b04b 100644 --- a/raven/processors.py +++ b/raven/processors.py @@ -71,7 +71,7 @@ def sanitize(self, key, value): key = key.lower() for field in self.FIELDS: - if field in key: + if self.FIELDS == "__ALL__" or field in key: # store mask as a fixed length for security return self.MASK return value @@ -104,10 +104,17 @@ def filter_http(self, data): data[n] = varmap(self.sanitize, data[n]) def process(self, data, **kwargs): - if 'sentry.interfaces.Stacktrace' in data: - self.filter_stacktrace(data['sentry.interfaces.Stacktrace']) - if 'sentry.interfaces.Http' in data: + if 'sensitive_post_params' in data['sentry.interfaces.Http']: + + if data['sentry.interfaces.Http']['sensitive_post_params'] == '__ALL__': + self.FIELDS = "__ALL__" + elif data['sentry.interfaces.Http']['sensitive_post_params']: + self.FIELDS = self.FIELDS.union(data['sentry.interfaces.Http']['sensitive_post_params']) + self.filter_http(data['sentry.interfaces.Http']) + if 'sentry.interfaces.Stacktrace' in data: + self.filter_stacktrace(data['sentry.interfaces.Stacktrace']) + return data