こんにちは、JS2IIUです。
Streamlitは簡単にWebアプリを作成できるパワフルなフレームワークですが、外部に公開する場合はセキュリティ対策が必要です。この記事では、Streamlitアプリでよくあるセキュリティリスクとその対策について、実用的なコード例を使って解説します。
セキュリティリスクの一覧
Streamlitアプリで特に注意すべきリスクは下記のとおりです。
- ユーザー入力のサニタイズの不備
- APIキーなどの機密情報を直接コードに記述
- セッション管理やアクセス制限の不備
ユーザー入力のサニタイズ
ユーザーからの入力をそのまま出力したり、サニタイズなしで使うのは危険です。
悪い例
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の使用
.envファイルを作成
Python
OPENAI_API_KEY=sk-XXXXXX- Pythonコード
Python
import os
from dotenv import load_dotenv
load_dotenv()
API_KEY = os.getenv("OPENAI_API_KEY").gitignoreに.envを追加
Plaintext
.envStreamlit 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バージョンの最新化
- 不要なファイルの公開を避ける
- ファイルアップロード時の抽出実装(拡張子・サイズ制限)
まとめ
Streamlitアプリを公開するときは、ユーザーからの入力は信頼せずに確認する、APIキーやパスワードなどの機密情報を直接コードに書かないといった基本の実装が重要です。
少しの工夫でセキュアプ化することで、ユーザーにも開発者にも安心なStreamlitアプリが実現できます。

