日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2024年11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

3分でプロキシサーバーを作ってみよう

2013-11-05
3分でプロキシサーバーを作ってみよう

はい。 超 久々の プログラミング クッキングのお時間です

基本材料 IdHTTPProxyServer1
IdServerIOHandlerStack1
IdAntiFreeze1
設定
IdHTTPProxyServer1.IOHandler := IdServerIOHandlerStack1;

これだけです。 あとは、  IdHTTPProxyServer1.Activeにするだけです。

ネットワークの設定
使っているWindows に対応した
アクセスポイントモードの数百円のUSB Wi-fi を用意します
コマンドプロンプトで ( ファイル名を指定して実行 cmd )
 ipconfig /all
で IP アドレスを探します
Ethernet adapter ワイヤレス ネットワーク接続:
        Connection-specific DNS Suffix  . :
        Description . . . . . . . . . . . : GW-USEco300
        IP Address. . . . . . . . . . . . : 192.168.100.1

アンドロイドの Wi-fi ポイントをじっとクリックすると設定が表示されるので
プロキシ 手動を選択して
上記のアドレスと 8080をいれると
プロキシ経由でアクセスできます。

※ Indyコンポーネントは 超不安定なので、データ破損には気をつけてくださいね

では、応用編



【応用編パケット監視】

ゲームの改造ツールに なんとかルーターってありますね。
単なるプロキシサーバーじゃないですか
Delphiなら あんなのまねるの ぷぷぷですね。

  • OnBeforeCommandHandler
  • OnHTTPDocument
  • DefaultTransferMode := tmFullDocument;
基本セットに 上の3点とアクセス禁止リストを追加すると
●ー●●ルーターを 簡単にまねできますね。


それは さておき

アクセス前に
URLがわかるので
不審なURLアクセスを防ぐことも可能です


IdHTTPProxyServer1

DefaultTransferMode := tmFullDocument;

パケットをメモリ内のストリームに読み込むモード。
内部的にはTMemoryStream

RequestURL

AContext.Target

リクエストしてきたURLです
アクセス遮断などに利用できます

通信ヘッダーをみたい場合は、AContext.Headers.Text

【通信を強制破棄します】
相手におしえずに閉じるモードはFALSEを渡します
AContext.Connection.Disconnect(False);

procedure TForm1.IdHTTPProxyServer1HTTPBeforeCommand(
  AContext: TIdHTTPProxyServerContext);
begin
//  ここに適当な判定式
  try
    try
    finally
      // 通信を強制破棄します
      AContext.Connection.Disconnect(False);
    end;
  except
  end;
end;

さらに応用編
OnHTTPDocumentイベントで Http Body 部分を解析
内部データのデコード
// s , tmpSrc : string;
//    ASrcMemStream : TMemoryStream;
//    AMemStream : TMemoryStream;

     s := AContext.Headers.Values['Content-Encoding']; {Do not Localize}
     if (LowerCase(trim(s)) = 'gzip') then
        begin
          try
            // Indyアホなので 念のため複製
            ASrcMemStream.CopyFrom(VStream , 0);
            ASrcMemStream.Position := 0;
            // gzip を 展開
            IdZLib.DecompressStream(ASrcMemStream , AMemStream);
            // 文字列に変換
            StreamToDirectString(AMemStream , tmpSrc);
          except
          end;
        end
       else
        begin
            // 文字列に変換
           StreamToDirectString(VStream , tmpSrc);
        end;

procedure StreamToDirectString(AStream : TStream; var ATargetStr : string);
begin
// ※ シークできないStreamにはつかわないこと。
  SetLength(ATargetStr , 0);
  if (AStream.Size > 0) then
   begin
     try
       AStream.Position := 0;
       try
         SetLength(ATargetStr , AStream.Size);
         AStream.Read(ATargetStr[1] , AStream.Size);
//         CopyMemory( @ATargetStr[1] , TMemoryStream(AStream).memory ,AStream.Size);
       finally
       end;
     except
     end;
   end;
end;

Content-Type と URL を調べることを併用すると ある程度フィルタできるでしょう。


・Indyは、不安定
・Delphiは パターンマッチに弱い(正規表現)
(Xeくらいから付属らしいですけど)
を考慮すると あまりお勧めできませんけど


ブログ内 関連記事: 3分でプロキシサーバーを作ってみよう

 関連記事はありません。

ブログ内 関連記事: 3分でプロキシサーバーを作ってみよう

 関連記事はありません。
PR

[PR]