์ ๋ ์ค๋ ์ธ๋ถ์์ ๋ณด๊ณ ๋ XSS๋ฅผ ํตํด Jinja๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ด์ค์ผ์ดํ๋ฅผ ์ผ์ง ์๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ด๊ฒ์ ์ํํ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. ๋ง์ ์ฌ๋๋ค์ด 2007๋ ๋ถํฐ ์๋ ์ด์ค์ผ์ดํ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ Django ํ ํ๋ฆฟ์ ๋ํ ์ด์ ์ง์์ ํตํด Jinja๋ฅผ ์๊ฒ ๋์๊ธฐ ๋๋ฌธ์ ๋์ฑ ์ํํด์ก์ต๋๋ค.
์ธํฐ๋ท์ ๋ค์ ธ๋ณด๋ฉด ์ด ์ฌ์ค์ด ์ ์๋ ค์ง์ง ์์ ๊ฒ ๊ฐ๋ค. ์ฌ์ค, ์น ์ฌ์ดํธ์ jinja2๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ์ด์ค์ผ์ดํ๋ฅผ ํด์ ํ๋๋ก ๊ถ์ฅํ๋ ์ฑ (Python 3 ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ, 12์ฅ, cc @buchuki)๋ ์ฐพ์์ต๋๋ค. Github ํ๋ก์ ํธ์ ๋ฌด์์ ์ํ์ ๋ํ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด autoescape=True ๋๋ autoescape ํ์ฅ์ ํ๋ก์ ํธ์ ์ถ๊ฐํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค.
๊ทธ ์์ ์์ ๋ ์์ ํ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ด ๊ณ ํต์ค๋ฌ์ธ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ๋ฌธ์์์๋ ์ต์ํ ์๋ ์ด์ค์ผ์ดํ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๊บผ์ ธ ์์์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค. jinja2.Environment ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ชจ๋ ์์ ์ autoescape=True ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ฌธ์ ์ด๊ธฐ์ ์น์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
Jinja๋ HTML ๋ฟ๋ง ์๋๋ผ ๋ฒ์ฉ ํ ํ๋ฆฟ ์์ง์ ๋๋ค. ๋๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด HTML ํ ํ๋ฆฟ์ ๋ํด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ์ด์ค์ผ์ดํ๋ฅผ ํ์ฑํํ๋ Flask์์ Jinja๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ ํ๋ฆฟ ์์ง์ ์์ฒด ํ๋ ์์ํฌ์ ํตํฉํ๋ ๊ฒฝ์ฐ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช ์๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
์ฆ, HTML์ ์์ฑํ ๋ ์๋ ์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ์ ๋ฌธ์์์ ๋ถ๋ช ํ ๋ฐํ๋ ๊ฒ์ด ์ข์ ์ ์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ถ๋ถ์ ์ฃผ์ ํ๋ ์์ํฌ๊ฐ ์ด ์์ ์ ์ํํ๋ค๊ณ ๊ฐ์ ํ์ง๋ง(๋์ด ๋ ๋ง์ด, ๋ฒ๊ทธ๊ฐ ๋ ์ ์ ๋ฑ) Jinja๋ฅผ ์๋์ผ๋ก ํตํฉํ์ฌ ์ด๋ฌํ ์ค์๋ฅผ ํ๋ ์๊ท๋ชจ ํ๋ก์ ํธ๋ ๋ง์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์งํ ๋งํด์, Jinja์ ๋ฌธ์๋ ๊ทธ ์ฃผ์ ์ ๋ํด ์ ๋ง ์ด์ ํฉ๋๋ค. ๋ค์์ Jinja์ ๋ฌธ์๋ฅผ ์ด ๋ ๊ฐ์ฅ ๋จผ์ ํ์๋๋ ๋ด์ฉ์ ๋๋ค.
Jinja2๋ Django์ ํ ํ๋ฆฟ์ ๋ชจ๋ธ๋ก ํ Python์ฉ ํ๋์ ์ด๊ณ ๋์์ด๋ ์นํ์ ์ธ ํ ํ๋ฆฟ ์ธ์ด์ ๋๋ค. ์ ํ์ ์๋๋ฐ์ค ํ ํ๋ฆฟ ์คํ ํ๊ฒฝ์ผ๋ก ๋น ๋ฅด๊ณ ๋๋ฆฌ ์ฌ์ฉ๋๋ฉฐ ์์ ํฉ๋๋ค.
"Django์ ํ ํ๋ฆฟ์ ๋ชจ๋ธ๋ก ํจ" ๋ฐ "secure"๋ ์๋ ์ด์ค์ผ์ดํ์ ๊ฐ์ Django์ ํ ํ๋ฆฟ ๋ณด์ ๊ธฐ๋ฅ์ด ์๋ค๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ HTML์ธ ์์ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์งํ ๊ธฐ๋ฅ ๋ชฉ๋ก์์:
XSS ๋ฐฉ์ง๋ฅผ ์ํ ๊ฐ๋ ฅํ ์๋ HTML ์ด์ค์ผ์ดํ ์์คํ
์ ํ ์ฌํญ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ง ์๋ค๋ ๊ฒ์ ์ธ๊ธํ์ง ์์์ต๋๋ค.
"๊ธฐ๋ณธ API ์ฌ์ฉ" ๋ฌธ์ ํ์ด์ง์๋ ์๋ ์ด์ค์ผ์ดํ๊ฐ ํ์ฑํ๋ ๊ฒ์ผ๋ก ํ์๋์ง ์์ง๋ง HTML๋ ํ์๋์ง ์์ผ๋ฏ๋ก ๊ด์ฐฎ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ API "๊ธฐ๋ณธ"ํ์ด์ง ๋ก ์ด๋ํ๋ฉด :
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')
์ฒซ ๋ฒ์งธ ์๋ ์ฌ์ํ XSS์ ์ทจ์ฝํฉ๋๋ค. ์ฌ๋๋ค์ ํผ๋์ค๋ฌ์ํ๋ ๊ฒ์ด ์ณ์ต๋๋ค.
ํ ๋ฆฌํ์คํธ์ ์ ํฉํ ํ๋ณด์ธ ๊ฒ ๊ฐ์ต๋๋ค. :)
๋ชจ๋ ์ฌ๋์ ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆฌ์ง ์๊ณ ๋ ์ด ๊ธฐ๋ฅ์ ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ์ ๋ฐ๋ผ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋๋ ์ด๊ฒ์ wontfix๋ก ๋ซ์ ๊ฒ์ด์ง๋ง ๋ฌธ์ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ์์ ๋กญ๊ฒ PR์ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
ํ ๋ฆฌํ์คํธ์ ์ ํฉํ ํ๋ณด์ธ ๊ฒ ๊ฐ์ต๋๋ค. :)