SQLite3::setAuthorizer
(PHP 8)
SQLite3::setAuthorizer — 명령문이 수행할 수 있는 작업을 제한하는 권한 부여자로 사용할 콜백을 구성합니다.
설명
public SQLite3::setAuthorizer(?callable $callback
): bool
작업(읽기, 삭제, 업데이트 등)이 수행될 때마다 SQLite에서 호출할 콜백을 설정합니다. 이것은 SQL 문이 볼 수 없는 데이터에 액세스를 시도하지 않거나 데이터베이스를 손상시키는 악의적인 문을 실행하지 않도록 하기 위해 신뢰할 수 없는 소스에서 SQL 문을 준비할 때 사용됩니다. 예를 들어, 응용 프로그램은 사용자가 데이터베이스 평가를 위해 임의의 SQL 쿼리를 입력하도록 허용할 수 있습니다. 그러나 응용 프로그램은 사용자가 데이터베이스를 임의로 변경할 수 있기를 원하지 않습니다. 그런 다음 SELECT 문을 제외한 모든 것을 허용하지 않는 사용자 입력 SQL이 준비되는 동안 권한 부여자를 배치할 수 있습니다.
권한 부여자 콜백은 SQLite에서 준비한 각 명령문에 대해 여러 번 호출될 수 있습니다. SELECT
또는 UPDATE
쿼리는 읽거나 업데이트될 모든 열에 대해 권한 부여자를 호출합니다.
권한 부여자는 최대 5개의 매개변수를 사용하여 호출됩니다. 첫 번째 매개변수는 항상 주어지며 SQLite3
의 상수와 일치하는 int(액션 코드)입니다. 다른 매개변수는 일부 작업에 대해서만 전달됩니다. 다음 표에서는 작업에 따른 두 번째 및 세 번째 매개변수에 대해 설명합니다.
작업 코드 및 매개변수 목록
Action | Second parameter | Third parameter |
---|---|---|
SQLite3::CREATE_INDEX | Index Name | Table Name |
SQLite3::CREATE_TABLE | Table Name | null |
SQLite3::CREATE_TEMP_INDEX | Index Name | Table Name |
SQLite3::CREATE_TEMP_TABLE | Table Name | null |
SQLite3::CREATE_TEMP_TRIGGER | Trigger Name | Table Name |
SQLite3::CREATE_TEMP_VIEW | View Name | null |
SQLite3::CREATE_TRIGGER | Trigger Name | Table Name |
SQLite3::CREATE_VIEW | View Name | null |
SQLite3::DELETE | Table Name | null |
SQLite3::DROP_INDEX | Index Name | Table Name |
SQLite3::DROP_TABLE | Table Name | null |
SQLite3::DROP_TEMP_INDEX | Index Name | Table Name |
SQLite3::DROP_TEMP_TABLE | Table Name | null |
SQLite3::DROP_TEMP_TRIGGER | Trigger Name | Table Name |
SQLite3::DROP_TEMP_VIEW | View Name | null |
SQLite3::DROP_TRIGGER | Trigger Name | Table Name |
SQLite3::DROP_VIEW | View Name | null |
SQLite3::INSERT | Table Name | null |
SQLite3::PRAGMA | Pragma Name | First argument passed to the pragma, or null |
SQLite3::READ | Table Name | Column Name |
SQLite3::SELECT | null | null |
SQLite3::TRANSACTION | Operation | null |
SQLite3::UPDATE | Table Name | Column Name |
SQLite3::ATTACH | Filename | null |
SQLite3::DETACH | Database Name | null |
SQLite3::ALTER_TABLE | Database Name | Table Name |
SQLite3::REINDEX | Index Name | null |
SQLite3::ANALYZE | Table Name | null |
SQLite3::CREATE_VTABLE | Table Name | Module Name |
SQLite3::DROP_VTABLE | Table Name | Module Name |
SQLite3::FUNCTION | null | Function Name |
SQLite3::SAVEPOINT | Operation | Savepoint Name |
SQLite3::RECURSIVE | null | null |
네 번째 매개변수는 해당하는 경우 데이터베이스 이름("main"
, "temp"
등)입니다.
권한 부여자 콜백에 대한 다섯 번째 매개변수는 액세스 시도를 담당하는 가장 안쪽에 있는 트리거 또는 보기의 이름이거나 이 액세스 시도가 최상위 SQL 코드에서 직접 발생한 경우 null
입니다.
콜백이 SQLite3::OK
를 반환하면 요청한 작업이 수락되었음을 의미합니다. 콜백이 SQLite3::DENY
를 반환하면 권한 부여자를 트리거한 호출은 액세스가 거부되었음을 설명하는 오류 메시지와 함께 실패합니다.
작업 코드가 SQLite3::READ
이고 콜백이 SQLite3::IGNORE
를 반환하면 준비된 문이 SQLite3::OK
가 반환된 경우 읽었을 테이블 열 대신 null
값을 대체하도록 구성됩니다. SQLite3::IGNORE
반환은 테이블의 개별 열에 대한 신뢰할 수 없는 사용자 액세스를 거부하는 데 사용할 수 있습니다.
테이블이 SELECT
에 의해 참조되지만 해당 테이블에서 추출된 열 값이 없는 경우(예: "SELECT count(*) FROM table"
과 같은 쿼리에서) SQLite3::READ
권한 부여자 콜백은 다음을 사용하여 해당 테이블에 대해 한 번 호출됩니다. 빈 문자열인 열 이름입니다.
작업 코드가 SQLite3::DELETE
이고 콜백이 SQLite3::IGNORE
를 반환하면 DELETE 작업이 진행되지만 자르기 최적화가 비활성화되고 모든 행이 개별적으로 삭제됩니다.
데이터베이스 연결에는 한 번에 하나의 권한 부여자만 있을 수 있습니다. SQLite3::setAuthorizer()에 대한 각 호출은 이전 호출을 재정의합니다. null
콜백을 설치하여 권한 부여자를 비활성화합니다. 권한 부여자는 기본적으로 비활성화되어 있습니다.
권한 부여자 콜백은 권한 부여자 콜백을 호출한 데이터베이스 연결을 수정하는 작업을 수행해서는 안 됩니다.
권한 부여자는 명령문이 실행될 때가 아니라 준비될 때만 호출됩니다.
자세한 내용은 » SQLite3 문서에서 확인할 수 있습니다.
매개변수
callback
- 호출할 callable입니다.
대신
null
이 전달되면 현재 권한 부여자 콜백이 비활성화됩니다.
반환 값
성공하면 true
를, 실패하면 false
를 반환합니다.
오류/예외
이 메서드는 오류를 발생시키지 않지만 권한 부여자가 활성화되고 잘못된 값을 반환하면 명령문 준비에서 오류(또는 SQLite3::enableExceptions() 메서드 사용에 따라 예외)가 발생합니다.
Examples
예제 #1 SQLite3::setAuthorizer() 예제
이것은 읽기에 대한 액세스만 허용하고 사용자 테이블의 일부 열만 반환됩니다. 다른 열은 null
로 대체됩니다.
<?php
$db = new SQLite3('data.sqlite');
$db->exec('CREATE TABLE users (id, name, password);');
$db->exec('INSERT INTO users VALUES (1, \'Pauline\', \'Snails4eva\');');
$allowed_columns = ['id', 'name'];
$db->setAuthorizer(function (int $action, ...$args) use ($allowed_columns) {
if ($action === SQLite3::READ) {
list($table, $column) = $args;
if ($table === 'users' && in_array($column, $allowed_columns) {
return SQLite3::OK;
}
return SQLite3::IGNORE;
}
return SQLite3::DENY;
});
print_r($db->querySingle('SELECT * FROM users WHERE id = 1;'));
위의 예는 다음을 출력합니다.
Array ( [id] => 1 [name] => Pauline [password] => )