2017-12-21 24 views
-2

TIdHTTP.Post()メソッドを使用して、私が把握できないWebサイトにフォームを送信しようとしています。私はコードをいくつか繰り返して変更してみました。そして、助けを必要とするロードブロックを打ちました。私はTIdHTTPとその使い方が比較的新しいので、私のコードについてはまったく愚かな何かのために許してください。Cookieを使用して安全なサイトでIndy TIdHTTP Postメソッドを使用する

これまでのところ、TIdHTTP.Get()メソッドを使用して、サイトからHTMLコードを取得することができました。次に、HTML内の<form>コードを調べ、そのフォームをWebサイトに送信するように、以下のコードを設計しました。

Post()メソッドを正しく使用していないため、またはCookieManagerを正しく使用していないため、コードが機能していないかどうかはわかりません。実行時に「内部サーバーエラー」が表示されます。

興味深いことに、手作業でログインするウェブサイトには、アカウント番号、生年月日、パスワードを入力する必要がありますが、HTMLに表示されるフォームには2つの変数が含まれています...ユーザー名AcctとDOB、それは思われる)と提出する。だから、どのように/それがパスワード変数を扱うか、どこに投稿するのか分からないのですか?ここで

は、Delphiでの私の現在のコードです:

procedure TMSBS_App_GUI.SubmitClick(Sender: TObject); 
Var 
    Response : String; 
    ResponseSet : TStringStream; 
    Params : TStringList; 
    IdHttp : TIDHttp; 
    IdSSL : TIdSSLIOHandlerSocketOpenSSL; 
    CookieMonster : TidCookieManager; 
begin 
    Params := TStringList.Create; 
    Params.Add('username=' + 'username'); 
    Params.Add('submit.value=' + 'submit'); 
    idhttp := TIdhttp.Create; 
    idhttp.AllowCookies := True; 
    CookieMonster := TiDCookieManager.Create; 
    idHttp.CookieManager := CookieMonster; 
    idSSLOpenSSLHeaders.Load; 
    IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    idHttp.ReadTimeout := 30000; 
    idHttp.IOHandler := idSSL; 
    idHttp.Get('https://' + website); 
    idhttp.Request.ContentType := 'application/x-www-form-urlencoded'; 
    idhttp.Request.Referer := 'http://' + website; 
    idSSL.SSLOptions.Method := sslvTLSv1; 
    idSSL.SSLOptions.Mode := sslmUnassigned; 
    ResponseSet := TStringStream.Create(nil); 
    Try 
    Memo1.Text := idHttp.Post('https://' + website,Params); 
    Finally 
    Params.Free; 
    ResponseSet.Free; 
    End; 
end; 

これはWebページである:

<!-- SiteMinder Encoding=ISO-8859-1; --> 
<!-- FCC File : (generic) caloglfn.fcc version 1.4--> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE"> 
<link rel="stylesheet" type="text/css" href="styles.css" /> 

<!-- Cross-frame scripting prevention: This code will prevent this page from being encapsulated within HTML frames. Remove, or comment out, this code if the functionality that is contained in this SiteMinder page is to be included within HTML frames. --> 
<SCRIPT type="text/javascript" src="https://ff.kis.v2.scr.kaspersky-labs.com/D0501246-9A02-314D-B50C-0C6D353C6332/main.js" charset="UTF-8"></script><link rel="stylesheet" crossorigin="anonymous" href="https://ff.kis.v2.scr.kaspersky-labs.com/2336C353D6C0-C05B-D413-20A9-6421050D/abn/main.css"/><script> 
if (top !=self) 
top.location=self.location; 
</SCRIPT> 

<title>Member/Pensioner Services Online Login</title> 
<script> 
function submit_form() 
{ 
    document.mos_form.username.value = document.mos_form.pUserID.value + document.mos_form.pDOB.value 

    document.mos_form.submit() 
} 
</script> 

</head> 
<body> 
<div id="wrapper"> 
    <div id="help"> 
    <a style="border-bottom:none;" href="mso_pso_access_help.html" target="_blank"><img STYLE="border:none;" src="Help_button.png" alt="Help" align="right"> </a> 
    </div> 
    <div id="header"> 
    <img class="crest" src="crest.png" alt="Crest - Superannuation Corporation" align="left"> 
    <img class="logo" src="mso_pso.png" alt="Pensioner Services Online (PSO) and Member Services Online (MSO)" align="right"> 
    </div> 
    <div id="toplinks"> 
    </div> 

<div id="form"> 
<form name="mos_form" method="POST" enctype="application/x-www-form-urlencoded" autocomplete="off"> 
<input type="hidden" name="autherrmsg" value="Login failed. Please try again."/> 

    <table width="100%" border="0" cellspacing="2" cellpadding="2"> 
    <tr> 
     <td align="left"> 
      <H1> 
      <span style="color: #3E842E;">Member Access</span> 
     </H1> 
    </td> 
    </tr> 

    <tr> 
     <td> 
      <p><font color="red"> </font></p> 
      <p> 
       To gain access to the complete range of online services, please enter your Membership Number, Date of Birth and Password below. 
      </p> 
      <p> If you need any help, click on Help in the top right-hand corner of this screen.</p> 
      <p> </p> 
     </td>   
    </tr> 
    </table> 

    <label for="hidden_username"></label> 
    <input type="hidden" name="username"> 
    <label for="hidden_url"></label> 
    <input type="hidden" name="url" value="<ERROR_INFORMATION>" READONLY> 
    <label for="hidden_proxy"></label> 
    <input type="hidden" name="proxypath" value="<PROXY_PATH>"> 

    <table width="900" border="0"> 
     <tr height="38" valign="top"> 
      <td width="200px" align="right" > <label for="mem_num" id="mem_num_label">Membership Number </label> </td> 
      <td width="200px" > <input id="pUserID" type="text" name="pUserID" value="" size="27" maxlength="13" id="mem_num"> </td> 
      <td width="500px"> 
     &nbsp;&nbsp; 
       <img STYLE="border:none;" src="mso_pso_question.png" onmouseover="this.style.cursor = 'help';" 
       title="Please enter your Membership Number. 
This is either your Employment Number or Pension Reference Number as found on our correspondence to you. 
If this is not available please Contact us."> 
     </td> 
     </tr> 
     <tr height="38" valign="top"> 
      <td width="200px" align="right" > <label for="dob" id="dob_label">Date of Birth </label> </td> 
      <td width="200px" > <input type="text" name="pDOB" value="" size="27" maxlength="8" id="dob" placeholder="DDMMYYYY"> </td> 
      <td width="500px"> 
      &nbsp;&nbsp; 
       <img STYLE="border:none;" src="mso_pso_question.png" onmouseover="this.style.cursor = 'help';" 
       title="Please enter your date of birth in this format: DDMMYYYY (e.g. 01021955)."> 
     </td> 
     </tr> 
     <tr height="38" valign="top"> 
      <td width="200px" align="right" > <label for="acc_num" id="acc_num_label">Password</label> </td> 
      <td width="200px"> <input type="PASSWORD" name="password" value="" size="27" maxlength="30" id="acc_num"> </td> 
      <td width="500px"> 
      &nbsp;&nbsp; 
       <img STYLE="border:none;" src="mso_pso_question.png" onmouseover="this.style.cursor = 'help';" 
        title='Please enter your Password. 
If you have forgotten your Password, use the &#34I&#39ve forgotten my password&#34 link to reset your access credentials. 
If you need to contact us, our details are available via the contact us button at the top right-hand corner of this screen.'> 

     </td> 
     </tr> 
     </tr> 
        <tr height="38" valign="top"> 
         <td width="200px" width=200></td> 
         <td width="200px" align="right"> <a href="https://www.*****.au/no-scheme-provided/register-or-reset"> I've forgotten my password </a> &nbsp;&nbsp; </td> 
         <td width="500px"> 
        </tr> 
     <tr height="38" valign="top"> 
      <td colspan=2 align="right"><a href="https://www.*****.au/register-or-reset/no-scheme-provided"> Register</a>&nbsp&nbsp <input type=button onclick=javascript:submit_form() value=Login> &nbsp;&nbsp;</td> 
     </tr> 
     <tr> 
    </table> 

    <script language="JavaScript"> 
       <!-- the script here sets the focus on UserID field 
       document.mos_form.pUserID.focus(); 
       document.mos_form.pUserID.select(); 
       function enter(e) 
       { 
       if (navigator.appName == "Netscape") 
        whichASCII = e.which; 
       else 
        whichASCII = event.keyCode 
       if (whichASCII == 13) 
       { 
        submit_form(); 
       } 
       } 
       document.onkeypress = enter; 
       if (navigator.appName == "Netscape") 
        document.mos_form.pAccessCode.onkeypress = enter; 
       // End of script --> 
       </script> 
       <!-- SiteMinder Variables START --> 

       <input type=hidden name=target value="http://website"> 
       <input type=hidden name=smauthreason value="0"> 
       <input type=hidden name=smagentname value="boFynyFE9jczy7ra1lzqLmXPeVc9xLptAWQSI9ksks1Hx/oGQmJxQA7Fy25/Xt9X"> 

       <!-- SiteMinder Variables END --> 


</FORM> 
</div> 
     <div id="footer"> 
      <table width=100% border=0 cellspacing="0" cellpadding="0"> 
       <tr> 
       <td height="30px" align="left" valign="middle" bgcolor="#3E842E">&nbsp;&nbsp; 
       <a href="http://www.*****.au/privacy" title="Privacy policy" target="_blank" class="wlink">Privacy</a> | 
       <a href="http://www.*****.au/disclaimer" title="Disclaimer" target="_blank" class="wlink">Disclaimer</a> 
       </td> 
       </tr> 
       <tr> 
       <td height="30px" colspan="2" valign="top" bgcolor="#949599" class="footer"><p class="footer"><span class="bold">Superannuation Company</span> ABN: ## ### ### ### AFSL: ###### RSEL: L#######<br /></td> 
       </tr> 
      </table> 
     </div> 

</div> 

<!--<script> 
function getParameterByName(name, url) { 
    if (!url) url = window.location.href; 
    name = name.replace(/[[]]/g, "\$&"); 
    var regex = new RegExp("[#&]" + name + "(=([^&#]*)|&|#|$)"), 
     results = regex.exec(url); 
    if (!results) return null; 
    if (!results[2]) return ''; 
    return decodeURIComponent(results[2].replace(/+/g, " ")); 
} 

document.getElementById('pUserID').value = getParameterByName('id'); 
</script> --> 

</body> 
</html> 

そしてここでは、POSTリクエストのためのWiresharkのパケットである:

 
Hypertext Transfer Protocol 
    POST /live/red_lojson/100eng.json?sh=0&ph=1383&ivh=928&dt=2720&pdt=214&ict=&pct=1&perf=widget%7C214%7C16%2Clojson%7C1027%7C656%2Csh%7C1031%7C0%2Csh%7C1035%7C16&rndr=render_toolbox%7C1375&cmenu=null&ppd=4&ppl=4&fbe=&xmv=0&xms=0&xmlc=0&jsfw= 
     Request Method: POST 
     Request URI [truncated]: /live/red_lojson/100eng.json?sh=0&ph=1383&ivh=928&dt=2720&pdt=214&ict=&pct=1&perf=widget%7C214%7C16%2Clojson%7C1027%7C656%2Csh%7C1031%7C0%2Csh%7C1035%7C16&rndr=render_toolbox%7C1375&cmenu=null&ppd=4&ppl=4&fbe=&xmv= 
     Request Version: HTTP/1.1 
    Host: m.addthis.com\r\n 
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0\r\n 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n 
    Accept-Language: en-US,en;q=0.5\r\n 
    Accept-Encoding: gzip, deflate\r\n 
    Referer: http://website/\r\n 
    Content-Length: 0\r\n 
    Content-Type: text/plain;charset=UTF-8\r\n 
    Cookie: na_tc=Y; uid=597293e6c72cb3be; na_id=2017072123300513069970337317; uvc=27%7C47%2C4%7C48%2C0%7C49%2C10%7C50%2C3%7C51; loc=MDAwMDBPQ0FVTlMxNDYxMzMxMjAwMDAwMDAwVg==; mus=0; ssc=pinterest%3B1%2Cgoogle%3B1\r\n 
    Connection: keep-alive\r\n 
    \r\n 

答えて

0

POSTあなたがWiresharkから示したリクエストは、あなたが示したHTMLと一致しません。実際には、そのPOST要求はHTML Webフォームの提出さえありません。

TIdCookieManagerオブジェクトを作成する必要はありません。TIdHTTPは、内部でオブジェクトを作成することができます。そして、その点については、TIdHTTPcreate the TIdSSLIOHandlerSocketOpenSSL object for youでも可能です。

また、CookieMonsterIdSSLオブジェクトが漏洩しています(このコードをARCプラットフォームで実行している場合を除く)。

いずれにしても、TStringListは正しく入力されていません。 <form><input>フィールドごとに、nameと非ブランクvalueを持つエントリを追加する必要があります。これには、hiddenフィールド、スクリプトによって割り当てられたフィールドなどがすべて含まれます。これを行わないと、簡単に「内部サーバーエラー」が発生する可能性があります。 HTMLフォームで定義されている10個の入力フィールドのうち、1つのみの値を入力しています。

あなたが示したHTMLに基づいて、代わりにこれを試してみてください。

procedure TMSBS_App_GUI.SubmitClick(Sender: TObject); 
var 
    Params : TStringList; 
    IdHttp : TIdHTTP; 
    UserID, DOB, Password, AgentName, Response: String; 
begin 
    IdSSLOpenSSL.LoadOpenSSLLibrary; 

    UserID := ...; 
    DOB := ...; 
    Password := ...; 

    IdHttp := TIdHTTP.Create; 
    try 
    IdHttp.AllowCookies := True; 
    IdHttp.ReadTimeout := 30000; 
    IdHttp.HandleRedirects := True; 
    //IdHttp.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdHttp); 

    Response := IdHttp.Get('https://' + website); 

    // I *suspect* the following value is randomly 
    // generated when the HTML is requested. If 
    // so, you will have to parse it out each time... 
    AgentName := 'boFynyFE9jczy7ra1lzqLmXPeVc9xLptAWQSI9ksks1Hx/oGQmJxQA7Fy25/Xt9X'; 

    Params := TStringList.Create; 
    try 
     Params.Add('autherrmsg=Login failed. Please try again.'); 
     Params.Add('username=' + UserID + DOB); 
     Params.Add('url=<ERROR_INFORMATION>'); 
     Params.Add('proxypath=<PROXY_PATH>'); 
     Params.Add('pUserID=' + UserID); 
     Params.Add('pDOB=' + DOB); 
     Params.Add('password=' + Password); 
     Params.Add('target=http://website'); 
     Params.Add('smauthreason=0'); 
     Params.Add('smagentname=' + AgentName); 

     IdHttp.Request.Referer := 'http://' + website; 
     Response := IdHttp.Post('https://' + website, Params); 
     Memo1.Text := Response; 
    finally 
     Params.Free; 
    end; 
    finally 
    IdHttp.Free; 
    end; 
end; 
+0

感謝を。私は他の人のIndyの問題について多くのあなたの記事を読んだ。言語を正しく知らないことに対する謝罪。私はこれをあまり使用していない、私は自分の足を取得しようとしている(私はVBAと同様のプロセスを使用してこの問題を解決したが、今firemonkeyを使用するクロスプラットフォームアプリケーションを開発するため、インディのイン・アウト)。あなたのコードは500 Internal Server Errorを削除するために働いたが、今は302 Site Not Foundエラーが出る。私は最後にそれを見ていきますが、そのロードブロッキングを解決する助けに感謝します。 – Sercho

+0

@Sercho 302はHTTPリダイレクトです。レスポンスの 'Location'ヘッダのURLにリクエストを繰り返すことになっています。 'TIdHTTP.HandleRedirects'プロパティをTrueに設定すると、' TIdHTTP'が自動的にそれを行います –

関連する問題