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

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

新規登録して質問してみよう
ただいま回答率
85.35%
データベース

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

Q&A

解決済

8回答

8364閲覧

フロントサイドから直接DBを触ってはいけない?

sosososo

総合スコア18

データベース

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

2グッド

6クリップ

投稿2021/07/07 01:26

現在、FlutterやVue等の勉強中なのですが、サーバーサイドアプリの必要性がわかりません。
SPA等で制作する場合サーバーサイドアプリはDBデータの取得・更新程度の役割しか無いと思います。
そこで直接フロントサイドアプリからDB操作を試みようと調べてみましたが、「セキュリティ観点からよくない」という記事を見かけます。
間にサーバーサイドアプリを挟んだとしても間接的ではありますが外からDBを操作していることに違いはないと思います。
サーバーサイドで認証機能を設けてアクセスに制限をかけてセキュリティを高める目的も有るのでしょうがDB接続用のパスワードをより強固なものにすれば解決するのでは?と思ってしまいます。

なぜフロントサイドから直接DBを触ってはいけないのでしょうか?

takotakot, boyon👍を押しています

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

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

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

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

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

guest

回答8

0

ベストアンサー

フロントからDBへアクセス出来ると言う事は、フロント側の人が適当にプログラムを作り、ユーザー/Passwordを使って接続操作できる事を意味します。
その為、公開環境ではセキュリティーに問題があると言う事と思います。
社内等の非公開のネット環境では、一般的に問題ありませんので、フロントから直接DBを操作可能として、開発側の負担を軽減させます。

3層の環境では、フロント側からはサーバー側プログラムのキック(起動)しか許しません。この時に、引数値(データ)をサーバー側へ一緒に添付します。
サーバー側プログラムは、当然に制限付き開発環境者のみが作成できます。
また、フロント側からサーバーへプログラムの保管ができない様に制限します。
この様にする事で、開発者が意図したデータしかDBへの更新が出来ない様にする訳です。

投稿2021/07/07 01:49

tosi

総合スコア553

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

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

sosososo

2021/07/07 02:24

tosi様から頂いた本回答が一番納得できた気がします。 ありがとうございます!!
guest

0

いやー、やっぱりフロントエンドからでもDBを更新したくなりますよね。そんなあなたにぜひ触っていただきたいのがFirestoreです。

https://firebase.google.com/docs/firestore

これはGoogleがFirebaseの一部として提供している、まさに「フロントエンドから直接データの取得・保存ができるDB」です。別に「フロントサイドから直接DBを触ってはいけない」わけではなかったのでした。良かったですね。

もっとも、他の回答者の方々は様々な否定的見解とその理由を書かれているわけですが(そしてそれらが間違っているわけではないのですが)、それは従来からあるDB(おそらくRDBMS)をそのままフロントエンドに大公開するという前提をおいているためです。まあ、普通に考えるとそういう前提になりますよね。それを覆すには、新しい仕組みが必要です。例えばFirestoreでは、セキュリティについては「セキュリティルール」というしくみを導入し、閲覧可能かどうか、変更可能かどうかを細かく設定することができます。これにより、他の利用者や運用者の情報を適切に隠しながら、必要な情報を参照・更新できるようになっています。

https://firebase.google.com/docs/firestore/security/get-started

一方で、単純にセキュリティルールだけですべてが解決できるわけではありません。そもそもセキュリティルールを適切に設定するのも困難です。ちょっと間違えると、一部の人以外には見えてはいけないデータが見えるようになってしまったり、あるいは更新したいデータが更新できなくなってしまったりします。あんまり難しい場合は素直にサーバーサイドにコードを書いた方が早かったのでは…ということになりかねません。

また、データだけではなく、コードについてもすべて公開するわけにはいかない場合もあります。ユーザーには見せたくないロジックもあるわけです。そのような場合、やはりサーバーサイドのコードが必要になります(FirebaseではCloud Function等を使うことになります)。

というわけで、Firestoreのような仕組みが一般的になるにはまだまだ超えなければいけないハードルがありそうです。でも、せっかくすでにある技術なので、興味があればぜひFirestoreで、フロントエンドから直接DBを触る経験を試してみていただくとよいのではないかと思います。

投稿2021/07/13 14:16

編集2021/07/20 19:14
takahashim

総合スコア1877

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

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

mpyw

2021/07/20 13:33

Firestore 否定派だけど, Firestore に触れてる回答があったほうがいいと思って覗いてみたら完璧な回答でしたので +1 しますw
guest

0

フロントエンドからDBにアクセスできる想定だと、アプリケーションに常にSQLインジェクション脆弱性がある状態と同等以上の危険性があります。

投稿2021/07/07 03:46

ockeghem

総合スコア11705

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

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

0

権限の問題が大きいかと。

一般論として、アプリケーションを利用するユーザに与えたい権限と DB で設定できる権限は、乖離があります。
ユーザが必要とする権限を DB に設定しようとすると、必要以上の権限を付与することになるので、少し雑な設計をしただけでセキュリティ的に問題が発生するケースがあります。
また、できるだけ小さな権限で運用しようとすると、各ユーザ(ロール)の権限をアプリ改修の都度洗い出し設定しなおす必要があるので、開発が非常に煩雑になります。
かと言って、権限を見直さなければ、必要以上の権限を残してしまう事になります。

余談ですが、この方法では管理レイヤをまたぐので、部署間の連携も必要となり運営コストアップにつながります。

アプリケーション利用者と DB の権限が完全に一致するようなアプリケーション(例えば、DB のクライアントアプリ)であれば、直接接続しても何ら問題はありません。
*まぁ、外部から DB を直接参照させるの?っていう別のポリシー的な問題は発生しますが。

投稿2021/07/07 04:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sosososo

2021/07/08 04:57

>アプリケーション利用者と DB の権限が完全に一致するようなアプリケーション(例えば、DB のクライアントアプリ) なるほど! 確かにそうですね。 必要以上の権限を与えてしまうこと、または必要以上の操作を可能にする情報を与えてしまうことになるためセキュリティ上問題があるということですね。 DBのクライアントアプリではDBを扱うことが目的なので問題はない。 非常にわかりやすかったです。ありがとうございます。
guest

0

DB接続用のパスワードをより強固なものにすれば解決するのでは?と思ってしまいます。

それはどこに保管するのですか?

ブラウザ内から使えるようにしていては、「誰でもデータベースを自由に触れる」のに等しい状態となります。

投稿2021/07/07 01:51

maisumakun

総合スコア146018

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

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

sosososo

2021/07/07 02:14

なるほど。確かにそうですね。。 APIトークン等をクッキーに保存する場合もありますが、その場合は時間制限付きのトークン等も使用するので問題はないですね。 ユーザー認証のように適宜入力させるようにすれば問題はないですか?
guest

0

フロントの定義が曖昧。
フロント=Webのブラウザで表示してる画面。
クライアント=PCやスマホのアプリ。

DBに接続するためにはパスワードが必要。
JSにパスワード書いてたら外から見える。危険。パスワードを複雑にしてもそのまま見えるんだから全く意味がない。
だからJSからDBに接続なんて最初から不可能。

クライアントでも同じ。アプリ内に埋め込んでたパスワードなどの機密情報が盗まれることはありえる。
アプリからDB接続自体は可能。普通はアプリの外の設定ファイルなどにパスワードを保存。外部に公開しないアプリなら埋め込んでもいい。
今はアプリでもサーバーサイドとの連携が普通だけど。

「フロントやクライアントなどのユーザーに届くものは中身を見られて全部盗まれる前提」
JSだけでなんでもできると勘違いしてる初心者はプログラミング以前の基礎知識が抜けてる。
プログラミングの前にユーザー視点で色々触ってみた経験が足りてない。

投稿2021/07/13 03:27

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ODBCなどでアプリとして直接接続しないかぎり
フロントサイドから直接DBを触る仕組みはありません
フロントのすることは所詮APIに値を渡すしてバックから
結果をもらうくらいです

投稿2021/07/07 01:43

yambejp

総合スコア116724

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

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

sosososo

2021/07/07 01:51

そうなんですね。。。 記憶違いかもしれません。失礼しました。 FlutterにはMySQL接続用のライブラリが有るみたいですが、その場合はとくに問題はないのでしょうか?
yambejp

2021/07/07 02:05 編集

クライアント側に大きな権限をつけたままミドルウェア経由で セキュリティガバガバでやるなら普通にAPI経由で フロントからfetch/jsonで処理したほうが簡単で 責任の切り分けも出来ると思います。 しかもそれって厳密にフロントでやっているという わけじゃないですしね
sosososo

2021/07/07 02:20

>クライアント側に大きな権限をつけたままミドルウェア経由で >セキュリティガバガバ 今回聞きたかったのはこういう質問はした際に出てくる 「セキュリティガバガバ」という箇所の具体的理由を知りたく。。。
m.ts10806

2021/07/07 03:07

ユーザーにルート権限与えるのと同じという話だと思います。 データもサービスも改竄し放題。
guest

0

なぜフロントサイドから直接DBを触ってはいけないのでしょうか?

絶対に触ってはいけないというルールはないので触りたければ触ればいいと思いますが、「セキュリティ観点からよくない」という記事が多いという事実を認識した上でやるかやらないかと思います。自分一人で使うものとかであれば、色んなリスクを承知の上でやってもいいかもしれませんね。

サーバーサイドで認証機能を設けてアクセスに制限をかけてセキュリティを高める目的も有るのでしょうがDB接続用のパスワードをより強固なものにすれば解決するのでは?と思ってしまいます。

どういう実装を想定されているのかちょっと分からないのですが、もしそれで解決するのであれば、そういう前例や紹介記事があってもおかしくないと思います。誰だってサーバレスでサービスを提供できるのであれば、それはすごくありがたいことですから。ですが、それらがないということは、だれもやらないということです。めちゃくちゃ手間をかけて色んなハードルをクリアすれば実現できるのかもしれませんが、それをやるくらいならサーバで簡単に実装した方が楽ということなんだろうと思います。

ただ、逆に考えるとこういう発想から新しい技術が生まれるのかもしれません。もし質問者ご自身で具体的な実装方法の考えがあるのならチャレンジされるといいと思います。

投稿2021/07/07 02:07

AbeTakashi

総合スコア4853

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

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

sosososo

2021/07/07 02:26

個人的にはセキュリティ上危険と言われているのは使用したくはないのですが、なぜダメなんだろうという素朴な疑問がありまして。。。 「セキュリティ観点からよくない」という記事は見かけるのですが具体的は理由までは載せてくれているサイトが見つからず。。。
AbeTakashi

2021/07/07 04:01

具体的な理由はmaisumakunさんや他の方も書いていますが、DB接続のパスワードを隠匿するのが極めて難しいから思います。たとえ表面上でうまく隠匿できたとしても、通信内容やデバッグツール等でのぞき見すればばれてしまいますし。そういうリスクを排除する手間が膨大なので、だれもそんなことをやろうとしないし、いちいち説明もしないのだと思います。1+1はなぜ2なのか?みたいなもんかもしれません。
sosososo

2021/07/08 05:01

他の方の説明もありとても納得できました。 たしかにプログラミング勉強したての頃、当たり前のことがわからず調べても出てこないみたいなことが有りましたが、それと似たような感じですかね?? いま納得できた状態で質問を振り返るとおかしなこと言ってるなと思います。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問