73.3. Статистика планировщика и безопасность#

73.3. Статистика планировщика и безопасность

73.3. Статистика планировщика и безопасность #

Доступ к таблице pg_statistic ограничен для суперпользователей, чтобы обычные пользователи не могли узнать о содержимом таблиц других пользователей. Некоторые функции оценки селективности будут использовать оператор, предоставленный пользователем (либо оператор, указанный в запросе, либо связанный оператор), для анализа сохраненной статистики. Например, чтобы определить, применимо ли сохраненное наиболее частое значение, оценщик селективности должен выполнить соответствующий оператор = для сравнения константы в запросе с сохраненным значением. Таким образом, данные в pg_statistic могут быть переданы операторам, определенным пользователем. Подходящий оператор может намеренно утечь переданные операнды (например, записывая их в журнал или записывая их в другую таблицу) или случайно утечь их, показывая их значения в сообщениях об ошибках, в обоих случаях возможно раскрытие данных из pg_statistic пользователю, который не должен иметь к ним доступа.

Для предотвращения этого применяется следующее ко всем встроенным функциям оценки выборочности. При планировании запроса, чтобы использовать сохраненную статистику, текущему пользователю необходимо либо иметь привилегию SELECT на таблицу или на связанные столбцы, либо использованный оператор должен быть LEAKPROOF (точнее, функция, на которой основан оператор). В противном случае оценщик выборочности будет вести себя так, как если бы статистика не была доступна, и планировщик будет продолжать с предположениями по умолчанию или запасными предположениями.

Если у пользователя нет необходимых привилегий на таблицу или столбцы, то во многих случаях запрос в конечном итоге получит ошибку доступа запрещен, в таком случае этот механизм на практике будет невидимым. Но если пользователь читает из представления с защитным барьером, то планировщик может захотеть проверить статистику базовой таблицы, которая в противном случае недоступна пользователю. В этом случае оператор должен быть непроницаемым, иначе статистика не будет использоваться. Нет прямой обратной связи об этом, за исключением того, что план может быть неоптимальным. Если есть подозрение, что это так, можно попробовать запустить запрос от пользователя с более высокими привилегиями, чтобы увидеть, приведет ли это к другому плану.

Это ограничение применяется только в случаях, когда планировщику необходимо выполнить пользовательский оператор на одном или нескольких значениях из pg_statistic. Таким образом, планировщик может использовать общую статистическую информацию, такую как доля нулевых значений или количество различных значений в столбце, независимо от прав доступа.

Функции оценки селективности, содержащиеся в сторонних расширениях, которые потенциально работают со статистикой с операторами, определенными пользователем, должны следовать тем же правилам безопасности. Обратитесь к исходному коду PostgreSQL для получения руководства.