1

ログインに成功した後、ログインしてフォームに入力して注文できるasp.net駆動のサイトがあります。これは、curl を使用してサーバーで行う必要があります。

ブラウザでこれを行うときはいつでも、特別なことは何もありません。

example.com/login.aspx にアクセスします。フィールドに入力して、返信してください。ログインしているユーザーのインデックス ページが返されます。この後、注文フォームへのリンクをクリックする必要があります。これを行うと、フォームが作成され、記入して送り返します。これにより、発注した注文の望ましい結果が得られます。ソースを分析すると、ページが JavaScript を介して送信されることが明らかになりましたが、サーバーは、リクエストが同一である場合、リクエストがどのように送信されたかを知ることができません。このプロセスの間、ブラウザから送信されたすべての投稿リクエストを追跡しました。

すべての投稿リクエストを受け取ったので、curl で同じことを行うコードをいくつか書きました。アルゴリズムは次のとおりです。

  1. get リクエストを送信して example.com/login.aspx ページを取得します
  2. 非表示フィールドの応答を解析します (ステートフル接続を模倣するために使用されるため)
  3. 状態と logindata を example.com/login.aspx に投稿します
  4. 送り返された状態を解析して更新する
  5. 注文フォームを入手する
  6. 状態を再度解析して更新する
  7. ブラウザが送信した状態と同じ投稿データを投稿します
  8. STDERR の代わりに情報をファイルに出力する

プロセス中、cookie は curl で使用されます。

最後の POST まですべてがスムーズに進みます。「成功」または「失敗」の結果の代わりに、検証エラーが言及されていない元のフォームが返されます。わざと意味不明な内容を入力したり、ブラウザーで空のままにしたりすると、検証エラーが表示されます。

私はasp.netの経験がなく、ここで完全に立ち往生しているので、この質問が具体的すぎる場合はご容赦ください。

質問:

ヘッダーと投稿データがブラウザーからのものとまったく同じである場合、curl 操作の結果がどのように異なるのでしょうか?

完全を期すために:

ブラウザからの投稿:

POST /DataEntry.aspx HTTP/1.1

ホスト: www.iftin.co

ユーザーエージェント: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0

受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8

Accept-Language: nl,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip、デフレート

接続: キープアライブ

リファラー: https://www.iftin.co/DataEntry.aspx

クッキー: ASP.NET_SessionId=SomethingX; .hawAuth=何かY

コンテンツ タイプ: application/x-www-form-urlencoded

コンテンツの長さ: 10111

Curl による投稿送信:

POST /DataEntry.aspx HTTP/1.1

ユーザーエージェント: Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0

ホスト: www.iftin.co

リファラー: https://www.iftin.co/DataEntry.aspx

Cookie:.hawAuth=SomethingZ; ASP.NET_SessionId=何かW

受け入れる: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8

Accept-Language: nl,en-us;q=0.7,en;q=0.3

Accept-Encoding: gzip、デフレート

接続: キープアライブ

コンテンツの長さ: 25236

予想: 100-継続

Content-Type: application/x-www-form-urlencoded;boundary=----------------------------5bb8ec4e5ecc

誰かがコードを見たい場合は、私に知らせてください。これを読んで時間を割いてくれてありがとう。

これを書いた後、curl リクエストの Content-Length がブラウザのリクエストよりも大幅に大きいことに気付きました。ブラウザの Post の本文にあるすべてのパラメータを自分のコードにコピーし、配列で curl に渡しました。

そのため、curl はデフォルトでリクエストにデータを追加する必要があります。これは事実ですか?

ページが SSL を使用している間、CURLOPT_SSL_VERIFYPEER は false に設定されます。これでしょうか?なんで?

4

0 に答える 0