use json serializer for sessions, change timestamps' data type, more security docs
json serializer can't serialize datetime (but integers), but is more safe than the pickle serializer.
This commit is contained in:
parent
5cd14a9cd3
commit
7a99935597
@ -119,3 +119,17 @@ users' sites (like attacker.yourservice.net).
|
|||||||
Obviously, this might lead to security issues with stealing, modifying and
|
Obviously, this might lead to security issues with stealing, modifying and
|
||||||
faking domain cookies.
|
faking domain cookies.
|
||||||
|
|
||||||
|
|
||||||
|
Sessions
|
||||||
|
========
|
||||||
|
|
||||||
|
We use Django's more safe JSONSerializer to serialize session data.
|
||||||
|
For Django >=1.5.3, the serializer is configurable.
|
||||||
|
For Django >=1.6 json will be the default rather than the less safe pickle format.
|
||||||
|
|
||||||
|
|
||||||
|
Django's SECRET_KEY
|
||||||
|
===================
|
||||||
|
|
||||||
|
Well, it needs to be secret, so don't just keep the value from our settings.py,
|
||||||
|
but define a really secret one in your local_settings.py.
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
import time
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
@ -10,7 +11,6 @@ from django.conf import settings
|
|||||||
from django.contrib.auth.hashers import check_password
|
from django.contrib.auth.hashers import check_password
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.sessions.backends.db import SessionStore
|
from django.contrib.sessions.backends.db import SessionStore
|
||||||
from django.utils.timezone import now
|
|
||||||
|
|
||||||
from ..main.models import Host
|
from ..main.models import Host
|
||||||
from ..main.dnstools import update, SameIpError, check_ip
|
from ..main.dnstools import update, SameIpError, check_ip
|
||||||
@ -52,7 +52,7 @@ def DetectIpView(request, secret=None):
|
|||||||
ipaddr = request.META['REMOTE_ADDR']
|
ipaddr = request.META['REMOTE_ADDR']
|
||||||
key = check_ip(ipaddr)
|
key = check_ip(ipaddr)
|
||||||
s[key] = ipaddr
|
s[key] = ipaddr
|
||||||
s[key + '_timestamp'] = now()
|
s[key + '_timestamp'] = int(time.time())
|
||||||
logger.debug("detected %s: %s" % (key, ipaddr))
|
logger.debug("detected %s: %s" % (key, ipaddr))
|
||||||
s.save()
|
s.save()
|
||||||
return HttpResponse(status=204)
|
return HttpResponse(status=204)
|
||||||
|
@ -3,10 +3,9 @@
|
|||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
from datetime import timedelta
|
import time
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.timezone import now
|
|
||||||
|
|
||||||
MAX_IP_AGE = 180 # seconds
|
MAX_IP_AGE = 180 # seconds
|
||||||
|
|
||||||
@ -27,7 +26,7 @@ def remove_stale_ips(request):
|
|||||||
"""
|
"""
|
||||||
# XXX is a context processor is the right place for this?
|
# XXX is a context processor is the right place for this?
|
||||||
s = request.session
|
s = request.session
|
||||||
t_now = now()
|
t_now = int(time.time())
|
||||||
for key in ['ipv4', 'ipv6', ]:
|
for key in ['ipv4', 'ipv6', ]:
|
||||||
timestamp_key = "%s_timestamp" % key
|
timestamp_key = "%s_timestamp" % key
|
||||||
try:
|
try:
|
||||||
@ -38,7 +37,7 @@ def remove_stale_ips(request):
|
|||||||
s[timestamp_key] = t_now
|
s[timestamp_key] = t_now
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
stale = timestamp + timedelta(seconds=MAX_IP_AGE) < t_now
|
stale = timestamp + MAX_IP_AGE < t_now
|
||||||
except (ValueError, TypeError):
|
except (ValueError, TypeError):
|
||||||
# invalid timestamp in session
|
# invalid timestamp in session
|
||||||
del s[timestamp_key]
|
del s[timestamp_key]
|
||||||
|
@ -235,6 +235,7 @@ SESSION_COOKIE_HTTPONLY = True
|
|||||||
SESSION_COOKIE_AGE = 14 * 24 * 3600 # 2 weeks, in seconds
|
SESSION_COOKIE_AGE = 14 * 24 * 3600 # 2 weeks, in seconds
|
||||||
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
|
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
|
||||||
|
|
||||||
|
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'
|
||||||
|
|
||||||
# python-social-auth settings
|
# python-social-auth settings
|
||||||
|
|
||||||
|
2
setup.py
2
setup.py
@ -38,7 +38,7 @@ setup(
|
|||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
platforms='any',
|
platforms='any',
|
||||||
install_requires=[
|
install_requires=[
|
||||||
'django<1.6',
|
'django >1.5.3, <1.6', # 1.5.3 has the session serializer configurable
|
||||||
'dnspython',
|
'dnspython',
|
||||||
'south',
|
'south',
|
||||||
'django-bootstrap-form',
|
'django-bootstrap-form',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user