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 を返す点が異なります。
例
例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