News

Aggiornamento del forum in corso, ne leggete qui: http://www.python-it.org/forum/index.php?topic=7051.0.

Topic: Sicurezza file Django  (Letto 907 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline saxsurfer

  • python habilis
  • **
  • Post: 52
  • Punti reputazione: 0
    • Mostra profilo
Sicurezza file Django
« il: Ottobre 29, 2015, 00:18 »
Ciao, oggi la mia domanda è questa:
come faccio a tenere al sicuro i miei file con Django?
Sto lavorando a un sito, con questa struttura

/sito-web/
  __init__.py
  settings.py
  urls.py
  wsgi.py

  /templates/
    base.html

  /myapp/
    __init__.py
    urls.py
    views.py

    /static/
      stylesheet.css
      image.jpg
      file.pdf

    /templates/
      index.html


sito-web/urls.py

import ...
urlpatterns = patterns('',
    url(r'^', include('myapp.urls')),                
    url(r'^admin/', include(admin.site.urls)),


sito-web/myapp/urls.py

import ...
urlpatterns = patterns('',
url(r'^$', views.index, name='index'), #chiama index.html
url(r'^download/$', views.download, name='download'), #chiama vista cper scaricare file.pdf


sia  in base.html che in index.html (che estende il primo) ho
{% load staticfiles %}

Il file settings.py ho

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
DEBUG = True
TEMPLATE_DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'myapp',
)
ACCOUNT_ACTIVATION_DAYS = 7
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'web-site.urls'
WSGI_APPLICATION = 'web-site.wsgi.application'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'web-site.db'),
    }
}
LANGUAGE_CODE = 'it-it'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.7/howto/static-files/
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]
LOGIN_REDIRECT_URL = '/'


In index.html ho un link che permette di scaricare il file file.pdf
[codice=html] ... clicca <a href="/download">qui</a> per scaricare ... [/codice]

Avviando il server di django per i test in locale tutto funziona bene.

Il problema è che posso scaricare il file anche scrivendo nel browser
http://127.0.0.1:8000/static/file.pdf
cosa che vorrei evitare.
Analogamente riesco a scaricare gli altri file in /static/
http://127.0.0.1:8000/static/image.jpg    (immagine che uso in index.html)
http://127.0.0.1:8000/static/stylesheet.css

Mi aspetterei invece che Django mi impedisca di accedere a indirizzi diversi da quelli configurati nei file di urls.

Se chiedo
http://127.0.0.1:8000/static/

esce la pagina di errore
[codice=xml]
Page not found (404)
Request Method:    GET
Request URL:    http://127.0.0.1:8000/static/

Indici di directory non sono consentiti qui.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
[/codice]

Se invece chiedo
http://127.0.0.1:8000/static
risponde
[codice=xml]
Page not found (404)
Request Method:    GET
Request URL:    http://127.0.0.1:8000/static

Using the URLconf defined in leansched.urls, Django tried these URL patterns, in this order:

    ^ ^$ [name='index']
    ^ ^download/$ [name='download']
    ^admin/

The current URL, static, didn't match any of these.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
[/codice]
così come se chiedo qualunque altro indirizzo non indicato negli urls.

Dove sbaglio?
« Ultima modifica: Ottobre 29, 2015, 00:22 da saxsurfer »

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2038
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of you Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of you Python code
Re: Sicurezza file Django
« Risposta #1 il: Ottobre 29, 2015, 00:32 »
Il runserver di Django serve qualsiasi file nella directory che hai specificato. In produzione non devi usare il server integrato in Django, perché appunto non è sicuro (e poi è lento).
Ti servirai di:
- un vero server che supporta il protocollo WSGI (ce ne sono tanti, per esempio uWSGI, Gunicorn sono tra i più popolari)
- un reverse proxy come Nginx per servire i file statici direttamente dal filesystem

Dovrai configurare Nginx in modo da servire i file statici quando l'url contiene /static. Negli altri casi la richiesta dovrà essere passata al server WSGI che servirà la richiesta. Integrare uWSGI con Nginx è facilissimo, basta usare la direttiva uwsgi_pass.

Offline saxsurfer

  • python habilis
  • **
  • Post: 52
  • Punti reputazione: 0
    • Mostra profilo
Re: Sicurezza file Django
« Risposta #2 il: Ottobre 29, 2015, 21:57 »
Ciao Python, grazie per la risposta.
Sto lavorando con il server di django per i test, ma ho già la stessa app che gira su pythonanywhere.com; lì il problema è lo stesso.
Riporto il file wsgi.py

"""
WSGI config for lefs project.

It exposes the WSGI callable as a module-level variable named ``application``.

For more information on this file, see
https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/
"""

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sito-web.settings")

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()


Qualche consiglio?

Offline Python

  • python sapiens sapiens
  • ******
  • Post: 2038
  • Punti reputazione: 2
  • Radon - Cyclomatic Complexity of you Python code
    • Mostra profilo
    • Radon - Cyclomatic Complexity of you Python code
Re: Sicurezza file Django
« Risposta #3 il: Ottobre 29, 2015, 23:31 »

Offline saxsurfer

  • python habilis
  • **
  • Post: 52
  • Punti reputazione: 0
    • Mostra profilo
Re: Sicurezza file Django
« Risposta #4 il: Ottobre 29, 2015, 23:51 »
No, ora me la leggo.