2012-01-08 40 views
11

Trong các tài liệu nó nói:Làm thế nào để ngăn chặn tự động thoát trong các mẫu Django?

Ngoại lệ duy nhất là các biến mà đã được đánh dấu là “an toàn” thoát ra ngoài, hoặc bằng cách mã mà dân biến, hoặc bởi vì nó đã được an toàn hoặc thoát ra áp dụng bộ lọc "

Phần" dân cư biến "hoạt động như thế nào? Tôi thực sự đang tìm cách tuyên bố thẻ mẫu an toàn trong chế độ xem. Tôi nghĩ không nên để một nhà thiết kế Đồng nghiệp của tôi sẽ chỉ thêm nó bất cứ khi nào cô ấy nghĩ 'đó là một ý tưởng hay.

https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs

Trả lời

22

Django có một lớp con của chuỗi gọi an toàn dây (đặc biệt SafeUnicode hoặc SafeString), có thể được tạo ra bằng django.utils.safestring.mark_safe. Khi động cơ mẫu đi qua một chuỗi an toàn nó không thực hiện HTML thoát vào nó:

>>> from django.utils.safestring import mark_safe 
>>> from django.template import Template, Context 
>>> Template("{{ name }}").render(Context({'name': mark_safe('<b>Brad</b>')})) 
u"<b>Brad</b>" 

Nếu bạn đang viết mẫu thẻ riêng bạn, bạn cần phải thực hiện render() mà sẽ trả về một chuỗi sẽ được xử lý an toàn, có nghĩa là bạn phải xử lý bất kỳ sự trốn thoát nào cần thiết cho bản thân. Tuy nhiên, nếu bạn đang viết bộ lọc mẫu, bạn có thể đặt thuộc tính is_safe = True trên bộ lọc để tránh tự động thoát khỏi giá trị được trả về, ví dụ:

@register.filter 
def myfilter(value): 
    return value 
myfilter.is_safe = True 

Xem https://docs.djangoproject.com/en/1.3/howto/custom-template-tags/#filters-and-auto-escaping để biết chi tiết.

5

Bạn có thể gọi django.utils.safestring.mark_safe và vượt qua bạn biến

... 
return direct_to_template('my-template.html', {'safe_var': mark_safe('<script>alert("");</script>')}) 

Trong template nó sẽ được in mà không cần thoát (cảnh báo sẽ bật lên). Mặc dù tự động thoát thực sự là một tính năng tuyệt vời sẽ giúp bạn tiết kiệm từ một số điều xấu.

Các vấn đề liên quan