我应该使用什么Django会话引擎来增强安全性?
dgenwo3n1#
如果“安全”意味着你需要以低丢失率存储数据,即耐久性,那么db或cached_db后端是最好的。(除了在特殊情况下,通常避免file,cache是为更接近于一次性的数据而设计的,signed_cookies太依赖于浏览器/用户行为)如果您的意思是希望私密地存储数据,并且第三方没有机会看到它,并且您设想的攻击最有可能针对您的服务器而不是用户计算机,那么signed_cookies可能是最好的(或者直接使用set_signed_cookie而不是使用会话),因为您不会将数据存储在您的服务器上。您需要了解Cookie的限制。如果您的意思是您想私密地存储数据,但您设想的攻击最有可能针对您用户的计算机,那么signed_cookies就不存在了,因为cookie中的数据可以被浏览器中访问cookie的人轻松读取。cookie数据是签名的,但不加密。如果你关心数据的完整性,即它不能被攻击者或用户篡改,那么不同的后端提供类似的保证水平:由于使用MAC,签名的cookie很难篡改,数据库后端很难,因为攻击者不应该访问数据库(如果他们这样做,你可能会有更大的问题)。简而言之,您需要知道您对哪些特定的安全属性感兴趣,以及您正在考虑哪些攻击向量。
db
cached_db
file
cache
signed_cookies
jfewjypa2#
TLDR; db会话引擎似乎是最安全的,但需要特别小心地创建备份。Django提供了这些会话引擎:
django.contrib.sessions.backends.db
django.contrib.sessions.backends.file
django.contrib.sessions.backends.cache
django.contrib.sessions.backends.cached_db
django.contrib.sessions.backends.signed_cookies
此外,您可以编写自己的或使用第三方,如django-redis-sessions。经过一点研究,我发现只有db和file引擎实现了clear_expired方法。当您调用clearsessions管理命令时,会调用此方法。因此,当您使用其他会话引擎时,属于离开网站而没有注销的用户的信息仍然可以读取他们会话中的内容。您只能在单个服务器上使用file会话引擎,这不适用于扩展。因此,我最安全的选择是使用db会话引擎,并确保django_session表从PostgreSQL pg_dump --exclude-table-data参数的数据库备份中排除。
django-redis-sessions
clear_expired
clearsessions
django_session
--exclude-table-data
2条答案
按热度按时间dgenwo3n1#
如果“安全”意味着你需要以低丢失率存储数据,即耐久性,那么
db
或cached_db
后端是最好的。(除了在特殊情况下,通常避免file
,cache
是为更接近于一次性的数据而设计的,signed_cookies
太依赖于浏览器/用户行为)如果您的意思是希望私密地存储数据,并且第三方没有机会看到它,并且您设想的攻击最有可能针对您的服务器而不是用户计算机,那么
signed_cookies
可能是最好的(或者直接使用set_signed_cookie而不是使用会话),因为您不会将数据存储在您的服务器上。您需要了解Cookie的限制。如果您的意思是您想私密地存储数据,但您设想的攻击最有可能针对您用户的计算机,那么
signed_cookies
就不存在了,因为cookie中的数据可以被浏览器中访问cookie的人轻松读取。cookie数据是签名的,但不加密。如果你关心数据的完整性,即它不能被攻击者或用户篡改,那么不同的后端提供类似的保证水平:由于使用MAC,签名的cookie很难篡改,数据库后端很难,因为攻击者不应该访问数据库(如果他们这样做,你可能会有更大的问题)。
简而言之,您需要知道您对哪些特定的安全属性感兴趣,以及您正在考虑哪些攻击向量。
jfewjypa2#
TLDR;
db
会话引擎似乎是最安全的,但需要特别小心地创建备份。Django提供了这些会话引擎:
django.contrib.sessions.backends.db
个django.contrib.sessions.backends.file
个django.contrib.sessions.backends.cache
个django.contrib.sessions.backends.cached_db
个django.contrib.sessions.backends.signed_cookies
个此外,您可以编写自己的或使用第三方,如
django-redis-sessions
。经过一点研究,我发现只有
db
和file
引擎实现了clear_expired
方法。当您调用clearsessions
管理命令时,会调用此方法。因此,当您使用其他会话引擎时,属于离开网站而没有注销的用户的信息仍然可以读取他们会话中的内容。
您只能在单个服务器上使用
file
会话引擎,这不适用于扩展。因此,我最安全的选择是使用db
会话引擎,并确保django_session
表从PostgreSQL pg_dump--exclude-table-data
参数的数据库备份中排除。