LoginSignup
1
1

More than 5 years have passed since last update.

DjangoのFormにKnockout.jsのdata-bind属性を書く際に勝手にエスケープされるケースの回避方法

Last updated at Posted at 2014-08-04

こう書くと、HTML上ではvalueUpdate: 'afterkeydown'がエスケープされてvalueUpdate: 'afterkeydown'となり、afterkeydownが効かない。

form_exapmle1.py
from django import forms


class ExampleForm(forms.Form):
    address = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'data-bind': 'value: address, valueUpdate: \'afterkeydown\''
            }
        )
    )

エスケープされないようにするには、mark_safeを使う。

form_exapmle2.py
from django import forms
from django.utils.safestring import mark_safe


class ExampleForm(forms.Form):
    address = forms.CharField(
        widget=forms.TextInput(
            attrs={
                'data-bind': mark_safe('value: address, valueUpdate: \'afterkeydown\'')
            }
        )
    )

data-bind属性の中にユーザーが入力した値を埋め込む仕様であればXSS脆弱性になるので、ユーザーの入力値は手動でエスケープする必要がある。(そもそも、そういう設計は避けた方がいいとは思うけど…)

参考
http://stackoverflow.com/questions/777458/django-form-values-without-html-escape

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1