मैं पहले आपके "पक्ष-खोज" प्रश्न का उत्तर दूंगा:
आप अपनी चिंताओं और चिंताओं के साथ पूरी तरह से सही हैं, और हर कोई जो एक एप्लिकेशन डिजाइन करता है, उसे समान चीजों के बारे में सोचना चाहिए। बाकी सब कुछ नीरस और लापरवाह है।
एक सफल 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
तालिका में डेटा जहां उपयोगकर्ता को ऐसा करने की कोई आवश्यकता नहीं है।