Pdo\Sqlite::setAuthorizer

(PHP 8 >= 8.5.0)

Pdo\Sqlite::setAuthorizer — SQL 文ができることを制限するため、authorizer として使われるコールバックを設定する

説明

public function Pdo\Sqlite::setAuthorizer(?callable $callback): void

アクション (読み取り、削除、更新など) が実行されるたびに SQLite が呼び出す コールバックを設定します。これは、信頼できないソースに由来する SQL 文を準備する際に、 その SQL 文が参照を許可されていないデータにアクセスしたり、 データベースに損害を与える悪意のある SQL 文を実行したりしないようにするために使います。

authorizer が使われるのは SQL 文を準備する段階だけです。 ひとつの SQL 文に対して複数回呼び出されることもあります。 SELECT や UPDATE のクエリは、 読み取りや更新の対象となるカラムごとに authorizer を呼び出します。 また、SQLite が SQL 文を準備し直すたびに再度実行されます。 これは、たとえばスキーマが変更された後など、SQL 文の実行中に起こることもあります。

authorizer は最大5つの引数とともに呼び出されます。 受け取る引数については SQLite3::setAuthorizer() で説明しています。

ひとつのデータベース接続に対して、同時に設定できる authorizer はひとつだけです。 このメソッドを呼び出すたびに、以前の設定は上書きされます。 authorizer はデフォルトで無効になっており、null のコールバックを設定すれば 再び無効にできます。

コールバックは、自身を呼び出したデータベース接続を変更してはいけません。

さらに詳しい情報は » SQLite のドキュメント を参照ください。

注意:

このメソッドは SQLite3::setAuthorizer() と同等ですが、 bool ではなく void を返す点が異なります。

パラメータ

callback

呼び出される callable。 現在の authorizer コールバックを無効にするには null を指定します。

コールバックは Pdo\Sqlite::OK、 Pdo\Sqlite::DENY、 Pdo\Sqlite::IGNORE のいずれかを返さなければなりません。 Pdo\Sqlite::DENY を返すと、authorizer を呼び出した SQL 文は、 アクセスが拒否された旨のエラーとともに失敗します。 読み取りのアクションに対して Pdo\Sqlite::IGNORE を返すと、 読み取られるはずだったカラムが null に置き換えられるように SQL 文が準備されます。

戻り値

値を返しません。

エラー / 例外

このメソッド自体は例外をスローしません。しかし、authorizer コールバックが int を返さない場合や、返した int が Pdo\Sqlite::OK、Pdo\Sqlite::DENY、 Pdo\Sqlite::IGNORE のいずれでもない場合、 SQL 文の準備はそれぞれ TypeError と ValueError をスローします。

例

例1 Pdo\Sqlite::setAuthorizer() の例

この接続では読み取りのアクションだけを許可します。 アクションコードは SQLite3 クラスの定数として公開されているので、 これを使うには SQLite3 拡張モジュールが利用できる必要があります。 利用できない場合は、対応する整数値を直接指定しても構いません。

<?php
$db = new Pdo\Sqlite('sqlite::memory:');
$db->exec('CREATE TABLE users (id, name)');

$db->setAuthorizer(function (int $action, ...$args) {
    return match ($action) {
        SQLite3::SELECT, SQLite3::READ => Pdo\Sqlite::OK,
        default => Pdo\Sqlite::DENY,
    };
});

var_dump($db->query('SELECT name FROM users') instanceof PDOStatement);

try {
    $db->exec('DROP TABLE users');
} catch (PDOException $e) {
    echo $e->getMessage(), "\n";
}
?>

上の例の出力は、 たとえば以下のようになります。

bool(true)
SQLSTATE[HY000]: General error: 23 not authorized

参考

  • SQLite3::setAuthorizer() - SQL文が出来ることを限定するため、authorizer として使われるコールバックを設定する
+add a note

User Contributed Notes

There are no user contributed notes for this page.