快取顯著提高了 Django 應用程式效能,但保護敏感資料至關重要。 本文示範如何有效管理 Django 視圖中的快取控制,防止敏感資訊被快取。 這對於登入畫面或顯示使用者特定詳細資訊的頁面至關重要。
快取控制的重要性
不正確的快取配置會使敏感資料面臨安全風險。 如果沒有正確的設置,這些資訊可能會儲存在使用者的瀏覽器或中間代理中,從而產生漏洞。
在 Django 實現快取控制
@never_cache
裝飾器,如 Django 官方文件中所述,可防止基於函數的視圖被快取:
<code class="language-python">from django.views.decorators.cache import never_cache @never_cache def my_secure_view(request): # Secure view logic here return HttpResponse("This page is protected from caching!")</code>
為了增強跨多個基於類別的視圖的可重複使用性,自訂 mixin 提供了更清晰的解決方案:
<code class="language-python"># myproject/views.py from django.contrib.auth.mixins import LoginRequiredMixin from django.utils.decorators import method_decorator from django.views.decorators.cache import never_cache @method_decorator(never_cache, name="dispatch") class PrivateAreaMixin(LoginRequiredMixin): """Extends LoginRequiredMixin with Cache-Control directives."""</code>
這個 mixin 簡化了保護基於類別的視圖:
<code class="language-python"># myapp/views.py from django.views.generic import TemplateView from myproject.views import PrivateAreaMixin class IndexView(PrivateAreaMixin, TemplateView): """Example index view.""" template_name = "index.html"</code>
徹底的安全測試
全面的測試對於驗證PrivateAreaMixin
的功能至關重要。 以下範例示範了一個強大的測試套件:
<code class="language-python"># myproject/tests/test_views.py from django.test import TestCase, RequestFactory from django.contrib.auth.models import AnonymousUser from django.contrib.auth import get_user_model from django.http import HttpResponse from django.views import View from myproject.views import PrivateAreaMixin class PrivateAreaMixinTest(TestCase): """Tests the PrivateAreaMixin's Cache-Control implementation.""" factory = RequestFactory() @classmethod def setUpTestData(cls): cls.user = get_user_model().objects.create_user( username="testuser", email="user@test.xyz", password="5tr0ngP4ssW0rd", ) def test_login_required_with_cache_control(self): class AView(PrivateAreaMixin, View): def get(self, request, *args, **kwargs): return HttpResponse() view = AView.as_view() # Test redirection for unauthenticated users request = self.factory.get("/") request.user = AnonymousUser() response = view(request) self.assertEqual(response.status_code, 302) self.assertEqual("/accounts/login/?next=/", response.url) # Test authenticated user and Cache-Control headers request = self.factory.get("/") request.user = self.user response = view(request) self.assertEqual(response.status_code, 200) self.assertIn("Cache-Control", response.headers) self.assertEqual( response.headers["Cache-Control"], "max-age=0, no-cache, no-store, must-revalidate, private", )</code>
最佳實務
將 @never_cache
與可重複使用的 mixin(如 PrivateAreaMixin
)結合會產生乾淨、可維護的程式碼。 結合嚴格的測試,這種方法可確保敏感視圖的安全性並遵守最佳實踐。 您如何解決 Django 專案中的快取和敏感資料問題?
以上是透過視圖上適當的「快取控制」來提高 Django 專案的安全性的詳細內容。更多資訊請關注PHP中文網其他相關文章!