sql >> Databasteknik >  >> RDS >> PostgreSQL

Begränsade PostgreSQL-behörigheter för webbapp

Jag ska svara på din "side-quest"-fråga först:

du har helt rätt med dina bekymmer och bekymmer, och alla som designar en applikation bör tänka på samma saker. Allt annat är slarvigt och slarvigt.

För att mildra skadorna som kan orsakas av en framgångsrik SQL-injektionsattack bör du definitivt använda principen om minsta privilegium.

Det borde vara ganska enkelt att sätta upp ett system som matchar dina krav.

Jag använder objektnamnen från ditt exempel, förutom att jag använder understreck istället för minus. Det är bra att bara använda små bokstäver, understreck och siffror i objektnamn, eftersom det kommer att göra ditt liv enklare.

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

Men om man tar principen om minst seriöst bör man ge bordstillstånd individuellt och t.ex. tillåt inte app_user till DELETE och UPDATE data i tabeller där det inte finns något behov för användaren att göra det.



  1. SQL JOIN för att hitta poster som inte har en matchande post med ett specifikt värde

  2. Hur ringer man lagrad procedur i en vy?

  3. MySQL-uppdateringsfråga med WHERE-klausul och INNER JOIN fungerar inte

  4. Hur prioriterar man vissa frågor i MySQL?