4

C#で記述されたASP.NetMVC3Webアプリケーションがあります。

JavaScriptを使用してWebページから非同期的に呼び出すことができるようにJson結果を返すように設計されたActionResultが1つあります。アクションは基本的に次のとおりです。

public ActionResult FindSomething(string search)
{
   var result = GetSearchResult(search);

   return Json(new { @Result = result }, JsonRequestBehavior.AllowGet);
}

次に、Webページの1つに、データを取得するためのJavaScript(JQueryを使用)があります。

ただし、私が試したいのは、このFindSomethingアクションへのアクセスを制限して、自分のWebサイトコードのみが結果にアクセスできるようにすることです。現状では、誰でもWebブラウザからこのアクションを呼び出すことができます。

これを行うためのいくつかのオプションに関するアイデアはありますか?

このウェブサイトへのログインはないため、その方法で認証を行うことはできないことに注意してください。そして、私はパスワードアプローチに関連するhtmlソースコードに何も入れたくありません。


なぜ私はこれが欲しいのですか

このFindSomethingメソッドは、実際には、クレジットを使用して支払われるサードパーティのサービスを呼び出します。したがって、実際には、呼び出しの数が多いほど、コストが高くなります。

私の懸念は、誰かがこのURLを知っていて、同じサービスを使用したい場合、彼らは私たちのURLでそれを照会し、料金を回避できることです。

このサードパーティのサービスがこれを考慮しているかどうかはわかりませんが、サービスと対話するためのいくつかの方法を提供しています。1つはサーバーコード(私が行っている)を介して呼び出すことができるWebサービスを介して、もう1つはいくつかのインラインJavaScript参照を介して-後者はhtmlソースにハードコードされたライセンスキーを必要とします:S

...答えを求める価値があるかもしれませんが、サービスのこの欠陥をどのように回避するかに関係なく、SOで興味深い質問があります。

4

2 に答える 2

3

あなたの制約を考えると、それを達成するための信頼できる方法はないのではないかと思います。たとえば、偽造防止トークンを使用することで困難にすることができますが、100%防弾ではありません。ブラウザだけがHTTPリクエストを送信できるわけではないことを忘れないでください。誰でもHTTPリクエストを偽造して、サーバーに送信できます。

これが非GUIAPIで行われる方法は、公開鍵がクライアントに与えられることであり、これがWebサイトなどのGUIアプリケーションで行われる方法は、ユーザーにパスワードを与えることです。

于 2012-05-08T15:44:47.000 に答える
2

それを行う最も正しい方法は、ここで説明されているように、偽造防止トークン+ソルトを使用することです:

[ValidateAntiForgeryToken(Salt = Constants.AntiForgeryTokenSalt)]
public ActionResult FindSomething(string search) { ... }

これを以下のような「認証トークン」と組み合わせることができます。これにより、クロスサイトスクリプティングと不正アクセスの両方からアクションが保護されます。

[ValidateAntiForgeryToken(Salt = Constants.AntiForgeryTokenSalt)]
public ActionResult FindSomething(string search, string accessToken) { ... }

もちろん、通常の状況では、「アクセストークン」は何らかの形式の認証メカニズム(つまりOAuth)を介して取得されます。この場合、それは、表示に渡されて要求された即興の一意の文字列である可能性があります(偽造防止トークンと同じですが、「nonce」が付いているため、一度しか使用できません)。

于 2012-05-08T15:48:08.860 に答える