sql >> Databáze >  >> RDS >> PostgreSQL

Omezená oprávnění PostgreSQL pro webovou aplikaci

Nejprve odpovím na vaši „vedlejší otázku“:

se svými obavami a obavami máte naprostou pravdu a každý, kdo navrhuje aplikaci, by měl přemýšlet o stejných věcech. Všechno ostatní je nedbalé a nedbalé.

Chcete-li zmírnit škody, které mohou být způsobeny úspěšným útokem SQL injection, rozhodně byste měli použít zásadu nejmenšího privilegia.

Mělo by být docela jednoduché nastavit systém, který odpovídá vašim požadavkům.

Použiji názvy objektů z vašeho příkladu, kromě toho, že budu používat podtržítka místo mínusů. Je dobré v názvech objektů používat pouze malá písmena, podtržítka a čísla, protože vám to usnadní život.

/* 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;

Ale pokud berete zásadu nejméně vážně, měli byste udělovat oprávnění tabulky jednotlivě a např. nepovolit app_user na DELETE a UPDATE data v tabulkách, kde to uživatel nemusí dělat.



  1. Upozornění:Nedefinovaná vlastnost:stdClass::$user_id v C:\wamp\www\social\includes\class-query.php na řádku 134

  2. Získání hodnot výčtu MySQL pouze pomocí SQL

  3. jak získám rekurzivní výsledek dotazem na vlastní referenční tabulku v mysql?

  4. Metoda nebyla ve třídě nalezena