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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

4回答

597閲覧

【短文可】ログイン不要なサイトにおけるAPIの保護手法について

A21

総合スコア0

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

3クリップ

投稿2024/08/31 09:32

編集2024/08/31 09:38

実現したいこと

ログイン不要で使用できる翻訳サイトをnext.jsにて作成しています。
作成にあたりサイト内にAPIを設置するのですが、そのAPIの保護方法について教えていただきたいです。

発生している問題・分からないこと

ログイン不要で使用できるようにしたいため、APIの保護方法が全く分かりません。
具体的にはAPIを自分の作成するサイト以外から使用できないようにしたいのです。

自分のサイトのフロントエンドのみリクエストを許可し、別の人が作ったプログラムなどからリクエストをしても使用できないように、ということです。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

JWTトークンを利用しようかと思って以下のような実装をした

サイトにアクセスすると自動的にトークンを発行

HttpOnlyCookieにトークンを保存

トークンとともにAPIにアクセス

トークンの期限が切れていたら再度トークン取得

でもこれでは意味ないのでは、と思いました。
攻撃者がトークンを発行するAPIを叩いたら不正利用できてしまうし、これだけならばトークンを使っても使わなくてもリスクはそこまで変わらないのでは、と....

補足

提案いただけますと幸いです。
こう検索すれば出てくるよなどでも構いません。

DeepLの場合APIリクエストを単純に再送信してもエラーが出てしまうのですが、どうしてなのでしょうか。
どういった仕組みなのでしょうか。
イメージ説明

イメージ説明

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

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

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

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

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

TakaiY

2024/08/31 10:22

回答への応答に追加の条件を書かれましたが、そのように、すでに検討ずみのものがあれば、不採用になった理由も含めて質問に追記いただくと、回答する人に無駄な検討をさせずに目的に適う回答が得やすくなると思います。
utm.

2024/08/31 11:54

無理でしょう。 そもそもログイン可能にしても、全くおなじ問題が発生する
utm.

2024/08/31 12:46

建前上、APIの不正使用した場合、法的措置を取りますって規約作っておけばいいんじゃないですか? 質問趣旨として、SSLみたいなイメージでもユーザーがWebからやったのかスクリプト的なものでやったのか判別がつかないって言う趣旨であってますよね? CAPTCHA認証みたいなのを導入しても、手の込んだ偽装アプリがAPIを不正利用する可能性があってそれを防げないという話ですよね?
otn

2024/08/31 15:51

> 自分のサイトのフロントエンドのみリクエストを許可し、 って、「自分のサイトを見た時にクライアントPCのブラウザに送られるJavaScriptを解析されて、その通りの手段でAPIをリクエストされてしまう」を防止したいと言うことですか? JavaScriptを解析されて真似されるのを防止するのは無理では? (解析が難しいようなコードにすれば、軽い気持ちでの真似利用を防げるかと思いますが、本気で解析する人には通用しない) そもそも、ユーザー登録不要で誰でも使えるのに、そのAPIを使わせないようにしたい理由が分かりません。質問に書かれていない何らかの理由があるのでしょうが、その理由によっては他の解決手段もあるのでは?
tmp

2024/09/06 08:36

なんか状況がよくわからなくて妄想しました。 クライアント側が、真似されてしまう、しかも、CAPTCHAもダメって・・・ サーバー側しかない。それで対処する方法を考えると Webページからしかできないようにというのは、広告表示が理由? それだとCAPTCHAもダメってなりますね。(広告を張り替えた真似サイトを想像しました) APIチェック用バナーを用意して、それが表示されたか、どうかサーバー側でチェックして その後APIを受け付ける等をすればよいのではないでしょうか? (本当は広告が表示されたかチェックする方法があれば一番いい) サーバー側なのでチェックしているかは、クライアント側を見ても気がつきません。 もし、勝手にAPI利用する人が、バナーも含め広告表示もまねするならば、 それはそれでOKなんじゃないですか? しかし、単にエラーとすると相手に気がつかれてしまう恐れがあるので、 エラーとせずに正常にうごいてるような間違った変な回答を返すと面白いですよ。 そうすると、このWebサイト変な応答返すという発言をする人が出たりすると 不正利用を自白するようなことになったり… 後半は冗談ですw ※サーバー側で対処する方法の例を今考えただけですのでそのまま実行するはずないよね 個人的には、API利用の利益が、クライアント真似するコストやリスクを上回ってないと やる人は少ないと思うので、クライアント側の難読化等で十分で、異常がでてから判断するとかでもと思ってしまいます。しかし、最近、「MinifyされたJavaScriptのコードをChatGPTで読みやすい形式に」というニュースがでてきたので真似するコストがさがってる?
maisumakun

2024/09/06 09:42

何をどれくらい守りたいがゆえの発送なのでしょうか。 仮にブラウザ内でしか動かないようにしても、ブラウザの自動操作ツールで突破されることも考えられますが、そのようなものに対してはどうお考えでしょうか。
guest

回答4

0

PKI 使ったら?

例えば
API に 開始 のリクエストを送る
API からとある文字列(乱数でも良いけど) を返す
とある文字列を隠し持った秘密鍵で暗号化し、それと一緒にリクエストを送る
APIは公開鍵で復号化し、とある文字列が得られた時にのみリクエスとに答える

例えば
API に 開始 のリクエストを送る
API から暗号化にもちいる key を公開鍵で暗号化して返す
秘密鍵で復号化し得られたkey でリクエスト文字列を暗号化してリクエストする
API はkeyで復号化してリクエストを処理する

手抜き版
リクエスト文字列を秘密鍵で暗号化してリクエストする
APIは公開鍵で復号化し得られた文字列でリクエストを処理する

状態を持たずに済む手抜き版が良いのかな、Web的なAPIサーバーなら

リクエストは黙って受けて、レスポンスを公開鍵で暗号化して返す という手抜きもあるかな
あ、
POSTも有るだろうからこれはだめか

投稿2024/08/31 12:27

winterboum

総合スコア23549

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

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

0

CloudFront 等にある「署名付きURL」の仕組みを参考にするとよいでしょう。

やりかたは API の URL を提示する際、公開鍵暗号方式を用いて署名を末尾に追加する (例: http://example.com/api?foo=123&bar=456&signature=xxxxxxx)。
API が実行されると署名を検証するので、もしパラメータが改ざんされていればそこで弾ける。
署名をするには秘密鍵が必要なのだから、秘密鍵を知りえない第三者が正しい URL を生成することは不可能。

パラメータに制限時間を書いておいてけば、30秒以内のみ有効な URL のできあがり。
パラメータにIPアドレスを記録しておけば、そのIPアドレス以外からは叩けない。
リプレイ攻撃に対抗したいなら、一度目のリクエストでハッシュを記録しておき二回目以降はそこをチェックするなどの対応が必要。

投稿2024/11/02 03:01

68user

総合スコア2022

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

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

0

APIを保護する方法はいくつかあるよ。まず、自分のサイトのドメインからだけリクエストを受け付けるようにCORSを設定するといい。あとは、APIキーを使う方法もあるけど、フロントエンドにキーを置くとリスクがあるから注意が必要ね。

投稿2024/10/30 14:34

isai

総合スコア148

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

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

0

CORSを設定して、自サイトのオリジン(ドメイン)からのリクエストのみを許可すればよいのでは?。

投稿2024/08/31 09:49

patapi

総合スコア808

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

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

A21

2024/08/31 09:57

それも検討しました。 ただしCORSだけだとブラウザからのアクセスしか制御ができないため、別の人が作ったプログラムなどからリクエストをしても使用できないようになんらかの対策と併用するのが良いだろうというのが考えです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問