1

ユーザーが自分自身と新しく購入した製品を登録できる Web ページを作成しています。

そのため、ページは最初、シリアル番号と社会保障番号の 2 つの入力フィールドで構成されています。これらの値は、2 つの異なる API に対して検証されます。2 番目の API 呼び出しは呼び出しごとに費用がかかるため、ユーザーがこれらの API 呼び出しを悪用することはできません。ユーザーがすべてのシリアル番号にアクセスできないように、もう 1 つの番号も何らかの方法で制限する必要があります。

そして、この Web ページを ajax で作成して、優れたユーザー エクスペリエンスを実現したいと考えました。そのため、jQuery ajax 関数を使用して、ページのコード ビハインドに配置した webmethods を呼び出しています。

次に、各 Web メソッドは、資格情報を使用して一致する API を呼び出します。しかし、これは、誰でもクライアント側のスクリプトを編集して、API に対して必要な回数の呼び出しを行うことができるということではないでしょうか?

私はこれを防ぐことができる必要があります。どうすればそれを行うことができますか?ユーザーが挿入したスクリプトによって通話が開始されたのではないことを確認できますか?

別の質問ですが、両方の ajax 呼び出しが正常に返されたことをクライアント側で検証するにはどうすればよいですか? ajax 呼び出しが 1 つしかない場合は簡単です。私は成功のために何かをするだけです.ajax関数の一部です。入力フィールドの横にすべてのチェックマークが表示されていることを確認できましたが、これはユーザーによって簡単に改ざんされる可能性があります。これを行う良い方法は何ですか?両方の呼び出しが成功したらボタンを有効にして、ユーザーが API の結果を確認できるようにしたいと考えています。

[WebMethod]
    public static string CheckSerialNumber(String _input)
    {
        string result = null; 
        var client = new CheckSerialNumberClient(); //A service reference to the API
        try
        {
            //make the API call.
            result = client.checkSerialNumber(_input);
        }
        catch (Exception)
        {
            result = "An error occured";
        }
        return result;
    }

[WebMethod]
    public static string GetCustomerInfo(String _input)
    {
        string result = null; 
        var client = new CustomerInfoClient(); //A service reference to the API
        try
        {
            //make the API call.
            result = client.getCustomerInfo(_input, myCredentials); //credentials is so that the company that has the API can charge us for each call.
        }
        catch (Exception)
        {
            result = "An error occured";
        }
        return result;
    }

jQuery、私はこれを機能させましたが、表示することもできます。これは、入力が正規表現に対して検証された後です。

$.ajax({
type: "POST",
url: "/Default.aspx/CheckSerialNumber",
data: ...
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
    return true;
}
4

4 に答える 4

4

GetCustomerInfo を呼び出すときに使用する (そしてサーバー側で検証する) 必要があるノンス (単一使用キー) を CheckSerialNumber が返すようにすることができます。これにより、API ユーザーは GetCustomerInfo に進む前に CheckSerialNumber を通過するように強制されます。

これにより、最初にシリアル番号の検証を行わずに GetCustomerInfo を呼び出す問題は解決されますが、検証済みのシリアル番号が少なくとも 1 つあれば、現金がなくなるまで誰かが最初に呼び出し、次に別の呼び出しを繰り返すことを妨げることはありません。

シリアル番号ごとの呼び出し回数を制限することができます。その場合、攻撃者は有効なシリアル番号のリストを生成する必要があります (これがどれほど簡単かはわかりません)。

リクエスト IP を確認して、そのような呼び出しを制限しようとすることはできますが、正直なところ、誰かがそのような制限を回避するのを十分に阻止することは非常に難しいため、通常、このような攻撃はネットワーク レベルで処理されます。SSL を使用している場合、私の知る限り、SSL を使用すると IP スプーフィングが不可能になるため、生活が少し難しくなりますが、これも完全な証拠ではありません。

攻撃ツールを使用する場合、Cookie を削除したり無視したりすることは非常に簡単であるため、Cookie などの設定は重要ではありません。

すべてがうまくいったことの確認については、最初の呼び出しの成功メソッドで、2 番目の検証を呼び出すことができます (nonce キーを実装する場合は、とにかくこの方法で行う必要があります)。次に、GetCustomerInfo の成功メソッドで、検証も成功したことを確認できます。

最後の手段として、特定の時間内に client.getCustomerInfo API を呼び出す回数を制限します。これにより、誰かが制限を回避した場合に、そのサービスに支払う金額を制限することで、侵入による影響を制限できます。たとえば、平均して 1 分間に 100 回の呼び出しがあると言えます。したがって、1 分間に 200 回を超える呼び出しがあると、それが実際の要求の急増であるか攻撃であるかを理解するまで、サービスは新しい要求の処理を停止する必要があります。

于 2013-02-03T15:55:20.000 に答える
2

クライアントで検証されたかどうかに関係なく、クライアントから送信されたデータを常に検証する必要があります。そうしないと、悪意のあるクライアントに対して脆弱になります。悪意のあるクライアントを懸念している場合は、改ざんを防ぐ確実な方法がないことを受け入れる必要があります。認証および承認システムを使用したり、各リクエストにトークンを追加したり、許可されるリクエストの数を制限したりすることで、それらを少し難しくすることができます...しかし、それでも絶対的なセキュリティはありません.

両方の呼び出しが成功したことを確認したい場合は、呼び出しが成功したときに、いくつかのグローバル フラグを設定するだけです。または、最初の呼び出しが成功する前に、2 番目の呼び出しを開始できます。後の呼び出しで必要になるトークンを返すこともできますが、これも悪用される可能性があります。

セキュリティに関する考慮事項については、OWASP Web サイトも参照してください。特に「リファレンス」と「ハウツー」のセクションは役に立つかもしれません。

また、javascript がオフになっているクライアントが常に存在するため、Web サイトが期待どおりに機能しません。

また、これらのアクセスをスクリプト化したいクライアントのことも考えてください。または、これらの Web メソッドを API として提供したい場合、javascript を使用するクライアントがなく、提供されたデータをサーバー上で検証する必要があります。

于 2013-02-03T15:42:09.953 に答える
1

Web 入力ごとに 1 つの ajax 呼び出しを行っていますか? それらを1つにまとめて形にしてみませんか?

クライアント側の検証に加えて、サーバー側の検証も常に行う必要があることに注意してください。クライアント側の検証は、セキュリティを確保するのに十分ではありません。この場合、セッション変数またはデータベース テーブルを使用して、ユーザーを識別するシリアル番号に対して、ユーザーが行った呼び出しの数を記録できます。次に、x回の試行に失敗した後、それらを無視する方法があります。

IP を使用してそれらを識別することもできますが、これは堅牢ではありません。多くの人は、簡単に変更できる動的 IP アドレスを持っています。IP アドレスも簡単に偽装できます。

于 2013-02-03T15:45:44.257 に答える
0

データベース内のユーザー ストアの IP アドレスを取得し、1 分あたり x 回の試行と 1 日あたり x 回の試行のみを許可します。

于 2013-02-03T15:43:51.070 に答える