4

やあ!

サイトへの画像のアップロードを自動化しようとしていますが、魔女はデータベースを使用してファイルを追跡しています。ユーザー インターフェイスは...まあ、かなり安っぽく、ファイルがたくさんあります。私はデータベースにアクセスできないため、その回避策を見つける必要がありました。その結果、 cURLを使用してサイトのアップロード メカニズムを簡単に模倣できることがわかりました。

Mozilla の Firebug でブラウザから送信された POST データと、サイトのアップロード フォームのソース コードを調べました。サーバーに送信するために必要な POST フィールドを特定できたので、PHP で小さな cURL コマンドをまとめました。

私は Debian GNU/Linux とバージョン番号 5.3.20-1 の PHP を使用しています。関連するコードは次のようになります。

$strfilepath = '@' .  $item->getPathname();  // get next file from directory (directory iterator)
    
$postdata = array();

$postdata['upload'] = 1;
$postdata['category_id'] = 43;
$postdata['imgtoupload'] = $strfilepath;
$postdata['actie'] = 1;
        
curl_setopt($somecurl, CURLOPT_URL, "http://some.site.at.somwhere.com/image_up.php");
curl_setopt($somecurl, CURLOPT_POST, true);
curl_setopt($somecurl, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($somecurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($somecurl, CURLOPT_NOPROGRESS, false);
curl_setopt($somecurl, CURLOPT_VERBOSE, true); // FTW!
        
$response = curl_exec($somecurl);

ブラウザの POST コマンドを「人為的な」http リクエストと比較したいので、正確な質問は、cURL によって生成された POST (またはその他の HTTP) リクエストを取得する方法ですか? (Firebug ができるように。) curl でできる唯一のことは、CURLOPT_VERBOSE を有効にすることですが、返されるのはヘッダー データのみです。

curl_getinfo() の戻り値とコマンド ライン リストを調べたところ、サーバーが 302 HTTP 警告を出し、ファイルをアップロードしていないことがわかりました。

Connection #0 to host some.site.at.somwhere.com left intact

おそらく認証に問題がありますが、コードがサーバーに適切なデータを送信していることを確認したいと思います。

前もって感謝します!敬具: G.

編集 (13.01.09):

ハ!私はそれを作った!問題は、cURL が何らかの方法で送信データのタイプを上書きしたことでした。application/octet-streamの代わりに画像をマークしましたimage/jpeg。「送信するファイル」フィールドにタイプを明示的に指定したところ、魔女は問題を解決しました。

 $strfilepath = '@' .  $item->getPathname() . ";type=image/jpeg" ;

正常に動作します。助けてくれてありがとう!

4

1 に答える 1

0

最も簡単な方法はngrep、コマンド ラインから使用することです。

ngrep -W byline host some.site.at.somwhere.com and port 80

some.site.at.somwhere.comこれにより、ポート 80 で送受信されるすべてのトラフィックが stdout にダンプされます。-O次のフラグを使用して、出力を pcap ファイルに書き込むこともできます。

ngrep -O http-traffic.pcap -W byline host some.site.at.somwhere.com and port 80

ngrep一部のディストリビューションはメイン リポジトリにパッケージ化されていませんtcpdumpが、その場合の適切な代替手段であり、構文は似ています。

tcpdump -A -s 1600 host some.site.at.somwhere.com and port 80

代わりに、それをファイルに送信するには:

tcpdump -w http-traffic.pcap -s 1600 host some.site.at.somwhere.com and port 80

host some.site.at.somwhere.com and port 80どのツールを使用しても式は同じです。でそれを読むことができますman pcap-filter

于 2013-01-09T13:07:13.760 に答える