ユーザーの意図的な不正行為を考慮した場合、私はオーバーエンジニアリングしますか?


12

ユーザーが意図した不正行為(軽度に言えば)に対する保護を追加すると、ユーザーが被る可能性のある害がコードに関連していない場合、過剰なエンジニアリングになりますか?

明確にするために、次のような単純なJSON RESTfulサービスを公開しています。

GET /items - to retrieve list of user's items
PUT /items/id - to modify an item
POST /items - to add a new item

サービス自体はブラウザで使用するためのものではなく、ユーザーが制御するサードパーティ製アプリケーション(電話アプリ、デスクトップアプリなど)からのみ使用するものです。また、サービス自体はステートレス(つまり、セッションレス)でなければなりません。

認証は、SSL経由の基本認証で行われます。

私は、次のような1つの可能な「有害な」動作について話しています。

ユーザーはブラウザにGET URLを入力します(理由はありませんが...)。ブラウザは基本認証を要求し、それを処理し、現在のブラウジングセッションの認証を保存します。ブラウザを閉じずに、ユーザーは悪意のあるWebサイトにアクセスします。このWebサイトには、サービスへのPOSTを作成する悪意のあるCSRF / XSRF javascriptがあります。

上記のシナリオは非常にまれであり、ビジネスの観点からはあまり心配するべきではないことを知っています。しかし、状況を改善するために、JSON POSTデータでもユーザー名/パスワードが必要な場合に役立つと思いますか?

または、基本認証を完全に削除し、GETを削除して、認証情報を含むPOST / PUTのみを使用する必要がありますか?GETを介して取得された情報は機密性が高い場合もあります。

一方、カスタムヘッダーの使用は純粋なREST実装と見なされますか?基本認証を削除し、カスタムヘッダーを使用できます。そうすれば、少なくともブラウザーからのCSRF攻撃を回避でき、サービスを使用するアプリケーションはカスタムヘザーでユーザー名/パスワードを設定します。このアプローチの欠点は、ブラウザからサービスを使用できないことです。


3
この文を残すことのようなだけでなく、私の答えと同じように、私はまた、私はこれはおそらくより良いSOまたはセキュリティに答えられると思うだろう
ジェフLangemeier

1
RFC 2616(tools.ietf.org/html/rfc2616#section-9.5)で定義されているように、PUTとPOSTを切り替えたと思います。
スヴァンテ

回答:


6

オーバーエンジニアリング?どういたしまして。アンチXSRF対策は、安全なWebアプリケーションまたはサービスの必要な部分です。誰かがあなたを攻撃することを選択する可能性は「非常に低い」場合もそうでない場合もありますが、それによってソフトウェアの安全性が低下することはありません。

システムは一般にXSRFを使用して攻撃されており、結果はSQLインジェクションまたはXSSよりすぐに明らかに悪いものではありませんが、ユーザーが操作可能なすべての機能を損なうほどひどいものです。

つまり、呼び出し自体のプロパティのみがパラメーターである「純粋な」RESTfulインターフェースを使用できないということです。攻撃者が推測できないものをリクエストに含める必要があります。それはユーザー名とパスワードのペアかもしれませんが、それ唯一の可能な選択からはほど遠いです。パスワードのソルトハッシュから生成されたトークンと一緒にユーザー名を持つことができます。認証時にサービス自体が発行したトークンを使用できます(セッションで記憶したり、暗号で検証したりできます)。

GETを取り除く必要があります

いいえ、GET要求は、アクティブな書き込み操作のない読み取り要求に使用されます(それらは「べき等」です)。XSRF保護を必要とするのは書き込み操作のみです。


GETリクエストが機密情報を明らかにできる場合はどうなりますか?
晴れ

@Sunny:機密データについてはどう考えていますか?
クリス

2
クリス、私が妄想に陥った場合、「間違った」ユーザーによって受信された場合、すべてのデータは機密です:)。その理論的。
晴れ

pls、私が追加した質問の変更を確認します。
晴れ

1
応答(GETまたは他のメソッド)に、ユーザーのみが表示する必要があるデータを含めることは問題ありません。XSRF攻撃では、攻撃者はユーザーに特定のリクエストを行わせることができますが、そのリクエストから返されるレスポンスを読み取ることはできません。ターゲットスクリプトが特別な方法で構築され、サードパーティのページが<script>タグから意図的に(「JSONP」)または誤って(保護されていないJSON)を読み取れないようにします
ボビンス

32

何も信用しないでください。すべてのリクエストは攻撃です。すべてのユーザーはハッカーです。この考え方で開発すれば、アプリケーションははるかに安全で安定し、悪意のあるユーザーに乗っ取られる可能性が低くなります。あなたのデータ(あなたの最も貴重なリソースの 1つ)に深刻な問題抱えているために、あなたのセキュリティを回避する方法を見つけるのに1人の賢い人しかいません。

アプリケーションにセキュリティホールが見つかった場合は、ギャップを埋めるために必要と思われるすべてのことを実行してください。特に、APIは、存在する中で最も信頼性の低いソフトウェアである必要があります。資格情報を要求し、Postリクエストに進みます。


4
パラノイアのイェーイ!敵がいます!(そして、すべてのリクエストに対して+1 が攻撃です
Treb

0

コードが確立され維持されている場合、エッジケースを調べて、ケースバイケースで対処する必要があります。

私の部分のいくつかのエラーによる修正:

GETは、適切なRESTfulサービスの一部として引き続き使用する必要があります。いずれにしても、認証が存在する必要があります。私が推測しようとしていたことは、セキュリティ上の目的でGETはPOSTとほとんど同じですが、ポストは情報をアドレスバーに入れずに動作するため、セキュリティ上の大きな違いになる傾向があります(そしてGETが嫌いな理由) @Leeによる投稿、

GET requests are used to retrieve resources, and PUT/POST are used to add/update 
resources so it would be completely against expectations for a RESTful API to use
PUT/POST to get data. 

これはサードパーティのアプリケーションで使用されるため、RESTfulサービスの適切なプラクティスに従って、この部分でエンド実装者が混乱しないようにする必要があります。


3
GETはセキュリティの点でPOSTとどのように異なりますか?両方ともトランスポート(HTTPまたはHTTPS)でプレーンに送信されますが、唯一の違いは、GETクエリ文字列がアドレスバーに表示されることです。
-tdammers

1
@Sunny:この点で、POSTはGETと同様に公開されています。信じられない場合は、Telnetを起動してWebサーバーに話しかけてください。
-tdammers

1
@ジェフ:telnet(またはcurl、wget、または昔ながらのスニファー)を作成する理由は、データストリーム全体を表示できるからです。はい、HTTPSはこの情報を盗聴者から隠しますが、SSL接続の両端の誰でもtelnetが見ているものを正確に見ることができます。
-tdammers

1
@Jeremy:POSTはアドレスバーにパラメーターを表示しませんが、データは実際のHTTPストリームと同じように表示されるため、全体として正しいです。
tdammers

7
GETリクエストはリソースの取得に使用され、PUT / POSTはリソースの追加/更新に使用されるため、PUT / POSTを使用してデータを取得するRESTful APIの期待に完全に反します。
リー

0

ユーザーが積極的に悪意のあることを含め、すべてのもっともらしい不測の事態を考慮し、「巧妙なセキュリティ」バリアを(成功して)リバースエンジニアリングする必要があります。

しかし、同時に、成功ハックの影響と、試行が行われる可能性を評価する必要があります。例えば:

  • 強固なファイアウォールで保護された内部サービスは、パブリックインターネット上のサービスよりも攻撃を受けにくい。

  • 誰かが顧客のディスカッションフォーラムを倒すことの影響は、顧客がクレジットカードを盗むことの影響よりも小さくなります。


私のポイントは、「完全なセキュリティ」は「無限に高価」であり、実際には達成できないということです。理想的には、徹底した費用便益分析に基づいて、どこに線を引くかを決定する必要があります。


ありがとう。問題はユーザーを「から」保護することではなく、ユーザーが無責任に行動する場合にユーザー自身を保護することでした。しかし、あなたの答えはいくつかの良い点になります。
晴れ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.