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_INDEXIndex NameTable Name
SQLite3::CREATE_TABLETable Namenull
SQLite3::CREATE_TEMP_INDEXIndex NameTable Name
SQLite3::CREATE_TEMP_TABLETable Namenull
SQLite3::CREATE_TEMP_TRIGGERTrigger NameTable Name
SQLite3::CREATE_TEMP_VIEWView Namenull
SQLite3::CREATE_TRIGGERTrigger NameTable Name
SQLite3::CREATE_VIEWView Namenull
SQLite3::DELETETable Namenull
SQLite3::DROP_INDEXIndex NameTable Name
SQLite3::DROP_TABLETable Namenull
SQLite3::DROP_TEMP_INDEXIndex NameTable Name
SQLite3::DROP_TEMP_TABLETable Namenull
SQLite3::DROP_TEMP_TRIGGERTrigger NameTable Name
SQLite3::DROP_TEMP_VIEWView Namenull
SQLite3::DROP_TRIGGERTrigger NameTable Name
SQLite3::DROP_VIEWView Namenull
SQLite3::INSERTTable Namenull
SQLite3::PRAGMAPragma NameFirst argument passed to the pragma, or null
SQLite3::READTable NameColumn Name
SQLite3::SELECTnullnull
SQLite3::TRANSACTIONOperationnull
SQLite3::UPDATETable NameColumn Name
SQLite3::ATTACHFilenamenull
SQLite3::DETACHDatabase Namenull
SQLite3::ALTER_TABLEDatabase NameTable Name
SQLite3::REINDEXIndex Namenull
SQLite3::ANALYZETable Namenull
SQLite3::CREATE_VTABLETable NameModule Name
SQLite3::DROP_VTABLETable NameModule Name
SQLite3::FUNCTIONnullFunction Name
SQLite3::SAVEPOINTOperationSavepoint Name
SQLite3::RECURSIVEnullnull

네 번째 매개변수는 해당하는 경우 데이터베이스 이름("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] =>
)