質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

2回答

2654閲覧

mysqlへのセキュアな外部接続許可について

weekend_lover

総合スコア2

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

2クリップ

投稿2021/04/01 17:18

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に接続するという点が不安要素となっております。
この実装で問題ないでしょうか。それともこの実装は何か致命的なセキュリティ上の問題を抱えていますでしょうか。

有識者の方のご助言を頂戴できますとありがたいです。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/04/01 18:45

モバイルアプリから直接 MySQL に接続するのではなく、Web API サーバーを立てて、そこでユーザー認証などを行うのがお勧めです。
weekend_lover

2021/04/02 10:41

皆様、ご回答ありがとうございます。危険であることはよく分かりました。flutter+firebase(firestore)の実装では、Web APIを使わずに直接DBへ接続しても問題が起きないのは、firebase側にバリデーションを行うレイヤーが存在するからなのでしょうか。flutter+firebaseの実装との違いを明確に理解したく、追加で質問させていただきました。宜しくお願い致します。
hoshi-takanori

2021/04/02 10:57

Firestore はもともと NoSQL Database + Web API であり、Firebase Auth のユーザー認証結果を使ってルール設定できるため、安全にすることもできなくはない、ということだと理解しています。
guest

回答2

0

weekend_loverさんが書かれたような実装方法は私が知る限りでは一般的ではないと思います。

hoshi-takanoriさんが質問の追記欄に書かれていますが、MySQLサーバの手前にWeb APIサーバを立てて、直接MySQLにアクセスさせない様にすべきかと。Web APIで必要なもののみを解放するようにすれば、セキュリティーの面でもわりかし安全かと思います(というか、Web APIの実装によりけりとなります)。

投稿2021/04/02 01:43

AbeTakashi

総合スコア4853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この実装で問題ないでしょうか。それともこの実装は何か致命的なセキュリティ上の問題を抱えていますでしょうか。

はい。致命的なセキュリティ上の問題を抱えています。

(Flutterの内部実装は知らないのですが)
パケットキャプチャでもすれば即座にでもアプリを通さずにMySQLに直接アクセス出来てしまいます。
結果としては任意のSQLの実行を許容することなりますね。

messagesテーブルには外部キーとしてユーザーIDを持たせます。
接続元アプリ側では下記のように接続をオープンし、編集/削除要求時にアプリ側で要求元ユーザー情報のバリデーションを行うことで権限の確認を行います。

との事なので、messageテーブルを好きに改竄されてしまいます。

既にコメントがある通り、
Ubuntuが立っているのであれば、そこにHTTP-APIを提供するwebアプリケーションを構築して、アプリからはAPIにしかアクセス出来ない様にするのが良いかと思いますよ。

投稿2021/04/02 05:10

tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問