2009-11-23 3 views
11

Se desidero consentire agli utenti di accedere a un sito Web utilizzando https:// anziché http://, è consigliabile offrire loro un'opzione per accedere alla vista o al modello.Django - link generati con {% url%} - come renderli sicuri?

Mi piacerebbe avere il collegamento "Usa connessione sicura" nella mia pagina di accesso - ma poi, come faccio senza codificare l'URL?

Mi piacerebbe essere in grado di fare proprio:

{% url login_page %} 
{% url login_page_https %} 

e li hanno indicano http://example.com/login e https://example.com/login.

Come posso fare questo?

+0

Curiosamente, però, perché dovrebbe qualsiasi utente vuole accedere tramite un HTTP quando https è disponibile? – Randell

+1

Poiché il loro proxy lascia solo la porta 80 attraverso (ha visto questa aberrazione alcune volte) – Kos

risposta

0

Forse potresti scrivere un tag url_https che fa la stessa cosa di url ma indica la versione HTTPS dell'URL.

6

Non ho lavorato molto con gli URL sicuri, ma ho lavorato un po 'con satchmo, che ha un middleware e alcuni programmi di utilità. Il middleware controlla solo il tasto SSL = True nei parametri di visualizzazione e rende la richiesta sicura in questo modo. Probabilmente non hai bisogno di renderlo così complesso, ma puoi dare un'occhiata a come è implementato.

Satchmo è su bitbucked here

Sono stato anche in grado di trovare uno snippet per il middleware che dovrebbe anche essere in grado di aiutarvi a ottenere un sicuro URL di accesso:

il primo è l'originale, mentre il secondo dovrebbe essere ab versione migliorata, ad un certo punto, ma potrebbe non essere più il caso. Puoi dare un'occhiata a loro.

Utilizzando uno Satchmo o di uno dei frammenti di middleware si dovrebbe essere in grado di fare qualcosa di simile

{% url login_page %} 
{% url login_page SSL=1 %} 
+0

I frammenti collegati sono una buona soluzione completa se si desidera definire determinati URL come https-only e quindi avere un middleware che si occupi di esso da lì. Sono eccessivi se tutto quello che stai cercando di fare è creare un link https. –

+0

È vero, per un solo collegamento non ne vale la pena. In tal caso la tua soluzione è migliore. – googletorp

18

Il tag {% url %} genera solo la parte di percorso dell'URL, non la parte host. Genera solo qualcosa come "/ path/to/here" (tutto ciò che devi fare è "view source" e vedrai che è l'intero contenuto di href). È il tuo browser che presume che tu stia attualmente utilizzando il numero http://example.com il link deve essere compreso tra http://example.com. Quindi tutto quello che dovete fare per generare un collegamento sicuro nel modello è:

<a href="https://example.com{% url blah %}"> 

Se non si desidera hardcode il nome di dominio (e non voglio), è possibile utilizzare the Site object e farlo sembrare qualcosa di simile:

<a href="https://{{ site.domain }}{% url blah %}"> 

O se non si desidera utilizzare il framework siti, è possibile utilizzare request.get_host:

<a href="https://{{ request.get_host }}{% url blah %}"> 
+0

Tuttavia, questo ha uno svantaggio; quando/se sposto il sito in un dominio diffrente, o qualcosa del genere, gli URL relativi non si romperanno, questo lo farà. Stavo cercando qualcosa di più simile alla funzione request.build_absolute_uri() con l'opzione di sostituire http con https, ma suppongo che sia meglio implementarla da solo. – kender

+0

Bene, non c'è modo di forzare https e usare un URL relativo. Modificato per ricordare che è possibile utilizzare il framework Sites per evitare di codificare il nome del dominio. –

+0

L'opzione precedente utilizzando request.get_host essenzialmente sta facendo la stessa cosa di request.get_absolute_uri e forzando https. –