サイトアイコン アマチュア無線局JS2IIU

【Streamlit】セキュリティ対策

こんにちは、JS2IIUです。
Streamlitは簡単にWebアプリを作成できるパワフルなフレームワークですが、外部に公開する場合はセキュリティ対策が必要です。この記事では、Streamlitアプリでよくあるセキュリティリスクとその対策について、実用的なコード例を使って解説します。

セキュリティリスクの一覧

Streamlitアプリで特に注意すべきリスクは下記のとおりです。

ユーザー入力のサニタイズ

ユーザーからの入力をそのまま出力したり、サニタイズなしで使うのは危険です。

悪い例

Python
import streamlit as st

user_input = st.text_input("検索キーワード")
st.write(f"検索結果:{user_input} のデータ")

このままだとJavaScriptやHTMLを含む入力が可能となり、XSS攻撃や意図しない表示を実行される可能性があります。

良い例

Python
import html

safe_input = html.escape(user_input)
if len(safe_input) > 50:
    st.error("キーワードは50文字以内にしてください")
else:
    st.write(f"検索結果:{safe_input} のデータ")

html.escape() を使って、引用符やスクリプトを避けます。html.escape()については以下のページを参考にしてください。

html — HyperText Markup Language のサポート — Python 3.13.3 ドキュメント

機密情報の管理

悪い例

Python
# NG
API_KEY = "sk-XXXXXX"

これはコードを公開するとAPIキーも漏洩します。

良い例: dotenvの使用

  1. .env ファイルを作成
Python
OPENAI_API_KEY=sk-XXXXXX
  1. Pythonコード
Python
import os
from dotenv import load_dotenv

load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY")
  1. .gitignore.env を追加
Plaintext
.env

Streamlit Cloud 用: secrets.toml

TOML
# .streamlit/secrets.toml
[api_keys]
openai = "sk-XXXXXX"
Python
api_key = st.secrets["api_keys"]["openai"]

簡易な認証機能の実装

Streamlitはプロデフォーマに認証機能を持っていませんが、簡易的なパスワード認証を試してみましょう。

Python
def check_password():
    password = st.text_input("パスワードを入力", type="password")
    return password == st.secrets["app_password"]

if check_password():
    st.success("認証成功")
    st.write("ここに本文を表示")
else:
    st.warning("正しいパスワードを入力してください")

.streamlit/secrets.toml

TOML
app_password = "mypassword123"

その他のセキュリティ対策

まとめ

Streamlitアプリを公開するときは、ユーザーからの入力は信頼せずに確認する、APIキーやパスワードなどの機密情報を直接コードに書かないといった基本の実装が重要です。

少しの工夫でセキュアプ化することで、ユーザーにも開発者にも安心なStreamlitアプリが実現できます。

参考リンク

モバイルバージョンを終了