テンプレート文字列リテラル
t-stringは、f-string(フォーマット済み文字列リテラル)の利便性を維持しつつ、補間(interpolation)の制御をライブラリ側に委ねることを可能にします。
用途と利点
セキュリティ
インジェクション攻撃の防止
f-stringでデータベースクエリやHTMLを生成すると、悪意のあるユーザー入力がそのままクエリやHTMLに挿入され、SQLインジェクションやXSS(クロスサイトスクリプティング)などの脆弱性の原因になります。
t-stringは、静的なリテラル部分と動的な値が分離されているため、ライブラリ側(データベースドライバやHTMLレンダラなど)が、値を安全にエスケープしたり、サニタイズしたりしてから最終的な文字列を構築できます。
ドメイン固有言語(DSL)のサポート
SQLやシェルのコマンドなど、特定の文法を持つ文字列を構築する際に、ライブラリがt-stringの構造を利用して、より厳密な処理を実行できます。
要は、t-stringを活用して、特定のドメインに適した文字列生成を行う機能を作ることができます。
code:sample.py
from string.templatelib import Template
def run():
variety = "Stilton"
f_string = f"Try some {variety} cheese!"
print(f_string, type(f_string))
# Try some Stilton cheese! <class 'str'>
# f-stringは即座に評価され、通常の文字列を生成される。
t_template = t"Try some {variety} cheese!"
print(type(t_template))
# <class 'string.templatelib.Template'>
# t-stringはstring.templatelib.Templateオブジェクトを生成する。
print(list(t_template))
user_comment = "<script>alert('XSS Attack!')</script>"
template_html = t"<div>コメント: {user_comment}</div>"
print(render_html(template_html))
# <div>コメント: <script>alert('XSS Attack!')</script></div>
# t-stringを使うと、ライブラリ側で値をエスケープしてから最終的な文字列を生成できる。
# Webフレームワークのレンダリング関数を想定
def render_html(template: Template) -> str:
parts = []
# (内部処理) Templateのstringsとvaluesを結合する
for i, value in enumerate(template.values):
# 💡 ここで、valueを str(value) として結合する前に HTMLエスケープを行う
escaped_value = value.replace("&", "&").replace("<", "<").replace(">", ">")
parts.append(template.stringsi) parts.append(escaped_value)
parts.append(template.strings-1) return "".join(parts)