Първо ще отговоря на въпроса ви за „странична мисия“:
вие сте напълно прав с вашите притеснения и опасения и всеки, който проектира приложение, трябва да мисли за едни и същи неща. Всичко останало е немарливо и небрежно.
За да смекчите щетите, които могат да бъдат причинени от успешна атака чрез SQL инжектиране, определено трябва да използвате принципа на най-малко привилегии.
Трябва да е доста лесно да настроите система, която отговаря на вашите изисквания.
Ще използвам имената на обектите от вашия пример, с изключение на това, че ще използвам долни черти вместо минуси. Добре е да използвате само малки букви, долни черти и цифри в имената на обектите, тъй като това ще улесни живота ви.
/* create the database */
\c postgres postgres
CREATE DATABASE test_database WITH OWNER app_admin;
\c test_database postgres
/* drop public schema; other, less invasive option is to
REVOKE ALL ON SCHEMA public FROM PUBLIC */
DROP SCHEMA public;
/* create an application schema */
CREATE SCHEMA app AUTHORIZATION app_admin;
/* further operations won't need superuser access */
\c test_database app_admin
/* allow app_user to access, but not create objects in the schema */
GRANT USAGE ON SCHEMA app TO app_user;
/* PUBLIC should not be allowed to execute functions created by app_admin */
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin
REVOKE EXECUTE ON FUNCTIONS FROM PUBLIC;
/* assuming that app_user should be allowed to do anything
with data in all tables in that schema, allow access for all
objects that app_admin will create there */
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
GRANT SELECT, USAGE ON SEQUENCES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_admin IN SCHEMA app
GRANT EXECUTE ON FUNCTIONS TO app_user;
Но ако приемете принципа на най-малкото сериозно, трябва да предоставите разрешения за таблица индивидуално и напр. не позволява app_user
за DELETE
и UPDATE
данни в таблици, където не е необходимо потребителят да го прави.