3分でプロキシサーバーを作ってみよう
カテゴリー: ぷろぐらみんぐ/Indy
2013-11-05
3分でプロキシサーバーを作ってみよう
はい。 超 久々の プログラミング クッキングのお時間です
これだけです。 あとは、 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なら あんなのまねるの ぷぷぷですね。
●ー●●ルーターを 簡単にまねできますね。
それは さておき
アクセス前に
URLがわかるので
不審な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くらいから付属らしいですけど)
を考慮すると あまりお勧めできませんけど
はい。 超 久々の プログラミング クッキングのお時間です
基本材料 | 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;
●ー●●ルーターを 簡単にまねできますね。
それは さておき
アクセス前に
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くらいから付属らしいですけど)
を考慮すると あまりお勧めできませんけど