SQLiteのセキュリティベストプラクティス

この記事では、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インジェクション対策、データベース暗号化、アクセス制御など、多角的に対策をする必要があります。

コメント

コメントする

目次