2010-01-12 10 views
52

Sto provando a visualizzare un po 'di html in un messaggio che viene visualizzato tramite il nuovo framework di messaggi Django. In particolare, sto facendo questo tramite il metodo ModelAdmin.message_user, che è solo un wrapper sottile intorno messaggi():Come faccio ad emettere l'HTML in un messaggio nel nuovo framework dei messaggi di Django?

def message_user(self, request, message): 
    """ 
    Send a message to the user. The default implementation 
    posts a message using the django.contrib.messages backend. 
    """ 
    messages.info(request, message) 

Tutto quello che ho provato finora sembra per visualizzare sfuggito HTML.

self.message_user(request, "<a href=\"http://www.google.com\">Here's google!</a>") 

non funziona, né:

from django.utils.safestring import mark_safe 
... 
self.message_user(request, mark_safe("<a href=\"http://www.google.com\">Here's google!</a>")) 

La visualizzazione del codice del modello nel modello di amministrazione base.html è abbastanza semplice:

{% if messages %} 
    <ul class="messagelist">{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul> 
    {% endif %} 

Quindi sono Non sono sicuro di quello che sto facendo male.

Pensieri o indicazioni molto apprezzate, grazie!

risposta

15

Hai provato {{ message | safe }}?

Nel modello di sistema Django le variabili sono sempre con escape, a meno che non vengano specificate come sicure con il filtro safe. Questo valore predefinito rende anche l'inconsapevole protetto da un attacco di iniezione.

Non sono sicuro di come questo interagisca con mark_safe, ma forse è successo qualcosa nel frattempo che lo ha reso nuovamente pericoloso.

+0

{{messaggi | sicure}} effettivamente funziona; tuttavia, questo è un modello di base di amministrazione incorporato, quindi non è così semplice modificarlo (in più non voglio necessariamente contrassegnare ogni messaggio come sicuro). Sono abbastanza sicuro che il problema è che poiché questo viene salvato durante il ciclo di richiesta (e visualizzato sul prossimo), qualsiasi tentativo di contrassegnarlo come sicuro sarà inutile. – jsdalton

+0

Domanda: puoi contrassegnare il messaggio "sicuro" quando lo metti in coda? Non ho guardato, ma è stata la prima cosa che mi è venuta in mente. –

+0

@Peter - Ho provato (tramite mark_safe nell'esempio di codice nella mia domanda), ma senza fortuna. Da quello che posso dire, non viene conservato quando il messaggio viene effettivamente visualizzato (sulla richiesta successiva). – jsdalton

17

Come indicato nella seguente biglietto di Django, dovrebbe funzionare se si utilizza mark_safe() in combinazione con il backend SessionStorage: https://code.djangoproject.com/ticket/14976#comment:9

+3

Grazie!Usare plain mark_safe() ha funzionato correttamente una volta che ho aggiunto 'MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'' al mio' settings.py'. – rescdsk

+0

Questo non ha funzionato per me. Penso che fallisca quando imposto il messaggio e poi restituisco un reindirizzamento. –

+0

Funzionerà se il back-end di sessione è un cookie? –

61

Un'altra opzione è quella di utilizzare extra_tags parola chiave arg per indicare che un il messaggio è sicuro Ad esempio

messages.error(request, 'Here is a <a href="/">link</a>', extra_tags='safe') 

quindi utilizzare la logica modello da utilizzare il filtro di sicurezza

{% for message in messages %} 
    <li class="{{ message.tags }}"> 
    {% if 'safe' in message.tags %}{{ message|safe }}{% else %}{{ message }}{% endif %} 
    </li> 
{% endfor %} 
+3

Grazie per i suggerimenti. Penso che questo sia l'approccio più semplice, ma non invadente e più sicuro menzionato qui. Puoi controllare quale messaggio contrassegnare come sicuro, invece di applicare ciecamente '{{message | safe}}' globalmente. – Edwin

+1

@Edwin Perché? Quando non è sicuro visualizzare un messaggio proveniente dal framework dei messaggi? – kissgyorgy

+2

@Walkman: non se il messaggio contiene contenuti non attendibili. Come qualsiasi cosa presa dalla richiesta; quello sarebbe un buco XSS. –

Problemi correlati