3

Post リクエストの生成とデータの送信に Apache HttpClient を使用しています。リモート アプリケーションは、データを送信しているユーザーの IP アドレスを中継するため、ユーザーが指定した IP アドレスに対してポスト リクエストを送信したいと考えています。

これを構成するにはどうすればよいですか?

public static void loginUser(String username, String password, String ip) throws Exception{
      try {
            HttpClient client = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://login.myapp.com/");

            // Request parameters and other properties.
            List<NameValuePair> params = new ArrayList<NameValuePair>(2);
            params.add(new BasicNameValuePair("username",username));
            params.add(new BasicNameValuePair("password", password));
            httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

            // Execute and get the response.
            HttpResponse response = client.execute(httppost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                //etc....
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

編集:混乱を避けるために、

カスタム IP アドレスを httprequest ヘッダーに含めて、エンド アプリケーションが、この [アプリからの] リクエストがカスタム IP アドレスからのものであり、アプリケーションが実行されている IP アドレスからのものではないことを認識できるようにします。

私のアプリケーションがIPアドレス「1.1.1.0」のサーバーで実行されているとしましょう。現在、ユーザーは「test」、「test」、「199.199.199.0」を使用して loginUser メソッドを実行しています。これで、アプリケーションから宛先 URL への HTTP リクエストは、「199.199.199.0」から送信されたようになります。

4

3 に答える 3

8

OPは次のよ​​うに書いています。

httprequest ヘッダーにカスタム IP アドレスを含めたいので、エンド アプリケーションは、[自分のアプリからの] このリクエストがカスタム IP アドレスからのものであり、アプリケーションが実行されている IP アドレスからのものではないことを認識します
...
google.co を開いたとしましょう。 .in、これで Google サーバーは、このリクエストが私の IP アドレスからのものであることを認識しました。Apache で HttpClient を使用する場合、その IP アドレスを構成して、Google サーバーが読み取ったときに、元々その IP アドレスから送信されたこの要求を処理するようにするにはどうすればよいですか?

できません。

(これは、実際には、以下の元の回答で書いた 4 番目の解釈です。)

送信者の IP アドレスは HTTP ヘッダーとして送信されません。これは、IP プロトコル ヘッダーのフィールドで送信されます。サーバーは送信者の IP アドレスをソケット レベルで取得します。HTTP 情報から取得するのではありません。

いいえ、IP を偽造することはできません (「なりすまし」と呼ばれます)。Java は raw ソケットをネイティブでサポートしていないため、IP レベルで情報を変更することはできません。できたとしても (または JNI やアウトバウンド パケット フィルタリング アプリケーションまたはハードウェアを使用しても)、TCP の性質により、IP スプーフィングは状況に応じて役に立たなくなります (応答は偽の IP に送信されるだけでなく、他の多くの問題をはるかに超えています)。この回答の範囲)。

だから、いいえ、あなたがやろうとしていることはできません。接続しようとしているサーバーの管理者が特別なルールを設定するか、アプリケーションの設計を真剣に考え直す必要があります。

編集:その他の代替案

質問のコメントでこれらについて言及しましたが、完全を期すために、ここでも回答に含めています。

セキュリティ要件に応じて考えられる解決策の 1 つは、ユーザーの VPN アクセスをセットアップして、ユーザーが最初に VPN 接続を確立してから、内部サーバーで Web アプリケーションを実行する必要があるようにすることです。

また、Web サーバーを VPN 経由でネットワークに接続し、VPN リンクを介して内部ログイン サービスに直接アクセスし、Web アプリケーションを WAN リンク上で実行することもできます。


これは、OPが要件を明確にする前の私の最初の答えでした:

あなたが何を求めているのかよくわからないので、私が考えることができる可能性を答えます。

投稿の送信先サーバーの IP アドレスをユーザーに指定させたい場合は、IP アドレスから URL を作成するだけです。

HttpPost httppost = new HttpPost("http://" + ip + "/");

ユーザーの IP アドレスに基づいてサーバーに何かをさせたい場合: ユーザーの IP アドレスは、サーバーがリクエストを受信したときにサーバー側で利用できるため、明示的に送信する必要はありません。サーバー側でその情報にアクセスする方法は、使用しているサーバーによって異なります。

サーバーに送信される IP アドレスをユーザーが指定できるようにする場合は、他のパラメーターを送信するのと同じように送信してください。

params.add(new BasicNameValuePair("whatever", ip));

リモート ユーザーに代わってサーバーから、ユーザーの IP アドレスに依存するシステムにログインし、そのリモート ユーザーになりすましてログインを成功させたい場合: できません。あなたがログインしようとしているシステムには、あなたがしようとしていることを正確に防止するためのセキュリティ対策が講じられています. おそらく、そのシステムの所有者がサーバーの IP アドレスに例外を設定する可能性があります。あなたは彼らに尋ねなければならないでしょう。

于 2013-08-16T05:15:07.837 に答える