この記事では、Pythonプログラミング言語でよく使用される軽量データベースエンジン、SQLiteにおけるセキュリティベストプラクティスについて解説します。具体的なコード例、その詳細解説、および応用例を含めています。
目次
はじめに:SQLiteとは
SQLiteは、サーバー不要で動作する軽量なデータベースエンジンです。独自のセキュリティリスクがありますので、適切な対策が必要です。
SQLインジェクションを防ぐ
SQLiteでもSQLインジェクションは一般的なセキュリティリスクです。この問題を防ぐために、プレースホルダを用いたパラメータ化クエリを使用する方法を見ていきましょう。
基本的なクエリの作成
# PythonでSQLiteを使うためのモジュールをインポート
import sqlite3
# データベースに接続
conn = sqlite3.connect('sample.db')
# カーソルオブジェクトを作成
c = conn.cursor()
# SQLクエリを作成
query = "SELECT * FROM users WHERE username=? AND password=?"
# クエリを実行
c.execute(query, ('user1', 'pass1'))
パラメータ化クエリ
プレースホルダ(`?`)を使用して、SQLクエリに値を埋め込む方法です。この方式は、SQLインジェクションを効果的に防ぐことができます。
データベース暗号化
SQLiteのデータベースファイル自体を暗号化することも考慮すべきです。SQLiteにはこのための拡張機能があります。
SQLite暗号化拡張(SEE)
SEEは商用ですが、高度な暗号化を提供します。
アクセス制御
SQLiteデータベースに対するアクセス制御も重要です。OSレベルでのファイルパーミッションによって、不正アクセスを防ぐ方法を見ていきます。
chmodによるパーミッション設定
# Linux/Unixでのchmodコマンド
# 読み取り・実行のみ許可(所有者は読み書き許可)
chmod 755 sample.db
応用例
例1:パスワードハッシュの使用
平文でのパスワード保存は避け、ハッシュ関数を使用して保存する方法です。
import hashlib
# ハッシュを生成
hashed_password = hashlib.sha256('my_password'.encode()).hexdigest()
# ハッシュをデータベースに保存
c.execute("INSERT INTO users (username, hashed_password) VALUES (?, ?)", ('user1', hashed_password))
例2:トランザクションの使用
データ整合性を保つためにトランザクションを使用する方法です。
# トランザクション開始
conn.begin()
try:
# クエリ1
c.execute("INSERT INTO table1 ...")
# クエリ2
c.execute("DELETE FROM table2 ...")
# コミット
conn.commit()
except:
# ロールバック
conn.rollback()
まとめ
SQLiteは軽量で便利なデータベースですが、セキュリティ対策も必要です。SQLインジェクション対策、データベース暗号化、アクセス制御など、多角的に対策をする必要があります。
コメント