Ste*_* D. 4 django error-reporting heroku sensitive-data sentry
引用Django文档:
@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'])
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,pass_word和credit_card_number POST参数的值将被隐藏,并在错误报告内的请求表示中用星号(******)替换,而name参数的值将被公开。
要在错误报告中系统地隐藏请求的所有POST参数,请不要向sensitive_post_parameters装饰器提供任何参数:
@sensitive_post_parameters()
def my_view(request):
...
Run Code Online (Sandbox Code Playgroud)
作为测试,我将以下代码添加到了Django 1.6应用程序中:
views.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()})
Run Code Online (Sandbox Code Playgroud)
forms.py:
class SensitiveParamForm(forms.Form):
not_sensitive = forms.CharField(max_length=255)
sensitive = forms.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
当我通过提交此表单时POST,我可以sensitive在Sentry报告中看到两个字段(包括)的值清除为当天。
我在这里做错了什么?我正在使用Django 1.6和Raven 3.5.2。
在此先感谢您的帮助!
原来,这源于Django本身的错误!
如果你没有改变DEFAULT_EXCEPTION_REPORTER_FILTER你的settings文件,你的默认筛选器SafeExceptionReporterFilter。
如果您使用过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
Run Code Online (Sandbox Code Playgroud)
与上面的问题是,虽然它会正确地返回一个QuerySet与敏感POST设置参数CLEANSED_SUBSTITUTE('********************')...... 它不会以任何方式改变request.body。
在使用Raven / Sentry for Django时,这是一个问题,因为事实证明get_data_from_requestRaven 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]
Run Code Online (Sandbox Code Playgroud)
最快的修复方法只是涉及子类化,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1614 次 |
| 最近记录: |