flutterでモバイルアプリケーションを作っております。
対象のアプリは、不特定多数のユーザーが利用する情報交換掲示板のようなもので、要件としては下記となります。
- 新規ユーザーは自由に会員登録できる。
- ログイン後、自由にメッセージを投稿できる。
- 自分の書いたメッセージは編集削除できる。
- 他人の書いたメッセージは編集削除できない。
flutterの公式ではDBとしてFirebaseを使うことを推奨していますが、課金の問題と、googleに依存し過ぎたくないこと等勘案し、firebaseではなく、Ubuntuにmysqlをインストールして連携しています。
幸いmysql1というパッケージのおかげで連携自体は簡単で、セキュリティを度外視すれば、FWの無効化、3306ポートの解放、外部ユーザーの作成等により問題なく実装できました。
今回お尋ねしたいのは、これを本番運用するにあたり、アクセス制限としてどのような設定とするのが理想的かです。
現時点で考えているのは、mysqlに'user'というユーザーを作り、どこからでもアクセス可能なようにホストをワイルドカード指定し、messagesテーブルに全権限を与える方法です。(下記)
mysql
create user 'user'@'%'; grant all on DBNAME.messages to 'user'@'%';
messagesテーブルには外部キーとしてユーザーIDを持たせます。
接続元アプリ側では下記のように接続をオープンし、編集/削除要求時にアプリ側で要求元ユーザー情報のバリデーションを行うことで権限の確認を行います。
flutterのDB接続処理
final conn = await MySqlConnection.connect(ConnectionSettings( host: 'サーバーのIP', port: 3306, user: 'user', db: 'DBNAME' )
これで動くことは動くと思うのですが、今まで不特定多数のユーザーに(特定のテーブルに限定しているとはいえ)外部接続から直接DBを自由に改変できる権限を与えるような実装をしたことがないため、これでセキュリティ的に問題がないかどうかが非常に心配です。
flutterは、PHP等と異なりバックエンドでリクエストのバリデーションを行うレイヤーが存在せず、フロントから直接DBに接続するという点が不安要素となっております。
この実装で問題ないでしょうか。それともこの実装は何か致命的なセキュリティ上の問題を抱えていますでしょうか。
有識者の方のご助言を頂戴できますとありがたいです。
どうぞよろしくお願い致します。