私はReactJs Webアプリ、Androidアプリが両方ともDjangoでビルドされたREST APIを使用するアプリです。プロジェクト全体はメディア/ニュース用であり、最大の部分ですREST APIはパブリックコンテンツですが、ユーザーがトークンベースの認証でAPIエンドポイントを保護している部分があります。
私たちが直面している問題は、REST APIをクロールして多くの場所でコンテンツを複製する人が多く、それらを追跡して停止することができないため、 REST API HARDERをクロールできるようにするいくつかの方法。
私の現在の提案された解決策:暗号化しかし、暗号化についての私の現在の理解は、RESTクライアントからのAPI応答をサーバーから暗号化し、JavaScriptでそれを復号化することです、しかしまだ復号化キーまたはトークンが必要なので、クライアント側でそのトークンを保存する他の問題に直面します。
暗号化よりもAPIを保護する優れた方法はありますか?
クライアント側でトークンを保存する際のベストプラクティスは何ですか?
ありがとう。
以前はウェブスクレイパーを仕事として書いていたのですが、あなたの問題の反対側にいたときに直面した最も困難な問題について、私の2セントです。
いくつかのAJAX呼び出しを介してコンテンツの一部またはすべてをロードします。スクレイパーがサイトに合わせて調整されていない場合、これによりスクレイパーが停止します。実際には、次のようなJSONで答えることができます。コンテンツの最初とコンテンツの次の部分をフェッチするために要求されるナンストークンのみ。
さらに、REST apiはReactアプリからのみ使用する必要があることがわかっている場合は、Django to the main React template。次に、REST APIはコンテンツIDとその一意のトークンを必要とします。データベースでは、そのトークンを特定のIPアドレスに割り当て、かなり短い時間でトークンを期限切れにします。これには、ボットが最初にアプリのHTML側をフェッチしてトークンを取得し、次にコンテンツ自体をフェッチする必要があります。
スロットルは通常、煩わしいものでした。私が遭遇した実装はIPアドレスに基づいており、ユーザーは毎秒10リクエストを許可されていました。それは典型的な人間がすることよりもはるかに多いです。それを渡すために、私のコードは10個のリクエストが送信された時間を追跡し、タイムアウト時にさらに10個のコンテンツをリクエストする必要があります。
ハニーポットをrobots.txt
のdisallow
に追加します。悪質なボットはルールに従いません。また、同じ仕事の一環として、コンテンツを再配布し、他の人にそれをこすり取ろうとしました。これは、ほとんどのボットを停止する最も効果的な方法でした。ハニーポットへの3回のヒットが許可された後、キャプチャの解決に成功しない限り、36時間ブラックリストに登録されました(そのために外部ツールを使用していました)。 Django=統合の場合、それをミドルウェアとしてコード化して、すべてのページに適用されるようにしました。これが最小限のパフォーマンス問題になるように、Djangoのキャッシュを使用して、ブラックリストまたはホワイトリストに登録されている(キャプチャの解決に成功した場合、ホワイトリストに追加されます)。
他のユーザーがあなたの公開Webサイト/ APIをクロールできないようにすることは難しい問題です。
REST APIへの迅速なリクエストが多すぎるクライアントIPのレート制限とブロックを試すことができます。これにより、RESTをクロールするための単純な方法を使用しているユーザーを停止できます= API、しかしそれはより高度な技術を使用するクローラーであなたを助けることはありません-私はあなたの特定の状況が何であるかわかりません。
また、 https://www.cloudflare.com/ のようなサービスは、データスクレイピング/ Webクロールに対する保護を提供し、問題への迅速な対応として実装が容易になる場合があります。