Перейти к основному содержимому

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

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

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

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

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

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