エンドユーザが任意のSQLを実行できるようにする読取り専用ユーザーでSQL tutorial websiteを作成中だったので、この質問と回答を読んでいます。
これは明らかに危険で、私はいくつかの間違いを犯しました。ここで私が最初の24時間に学んだものがあります(これのほとんどは他の回答によってカバーされていますが、この情報はより実用的です)。
- は、ユーザーテーブルまたはシステムテーブルへのアクセスを許可しない:
のPostgres:
REVOKE ALL ON SCHEMA PG_CATALOG, PUBLIC, INFORMATION_SCHEMA FROM PUBLIC
- あなたの読み取り専用ユーザーは唯一のあなたが必要なテーブルへのアクセス権を持っていることを確認します あなたが望むスキーマ:
のPostgres:
GRANT USAGE ON SCHEMA X TO READ_ONLY_USER;
GRANT SELECT ON ALL TABLES IN SCHEMA X TO READ_ONLY_USER
- 長時間実行をドロップするようにデータベースを構成しますが
Postgresの照会:
Set statement_timeout in the PG config file
/etc/postgresql/(version)/main/postgresql.conf
Postgresの機密情報を入れて考えてみましょう:
GRANT USAGE ON SCHEMA MY_SCHEMA TO READ_ONLY_USER;
GRANT SELECT ON ALL TABLES IN SCHEMA MY_SCHEMA TO READ_ONLY_USER;
ALTER USER READ_ONLY_USER SET SEARCH_PATH TO MY_SCHEMA;
- を任意のストアドプロシージャをロックダウンして、彼らは、読み取り専用ユーザーによって実行することができないように注意してください
編集:システムテーブルへのアクセスを完全に削除することで、ユーザーが許可されなくなりましたo cast()のような呼び出しを行います。だから、アクセスを許可するために、再度これを実行することもできます。
GRANT USAGE ON SCHEMA PG_CATALOG to READ_ONLY_USER;
グレート漫画:http://stackoverflow.com/questions/84556/whats-your-favorite-programmer-cartoon/84629#84629 –
私は上記の編集しました。それらの列を印刷するものがない場合、ユーザーに実際にどのように表示されますか? – johnny
Jacobの答えを参照し、http://unixwiz.net/techtips/sql-injection.html – outis