HTMLにSubmitボタンを動的追加するには?

解決


とも  2013-03-12 05:18:28  No: 44020

はじめまして、現在、Win7+TurboDelphi2006Personalで
ブラウザアプリ開発を行っております。

TWebBrowserを利用し、会員サイトを表示させてログインを
できるようにしたいと思っています。

要件としてIE・FFなど標準ブラウザでアクセスしてもログインが
できないようにしたいということです。

HTMLのテキストエリア挿入を参考にして
IHTMLDocument3とIHTMLInputElementを使うことで実現できるのでは
と考えておりますが、なかなかうまくいきません。

<span id="submit"></span>の中に動的に
<input type="submit" value="ログイン">を埋め込むには
どうすればよいでしょうか?

ログイン画面〜抜粋〜
<form action="login.php" method="post">
ログインID<input type="text" name="login-id"><br />
パスワード<input type="password" name="password"><br />
<span id="submit"></span>
</form>
〜ここまで〜

よろしくおねがいいたします。


Mr.XRAY  2013-03-12 07:39:14  No: 44021

こんなところが参考になるでしょうか.
「HTML コード挿入 実行時 Delphi」で検索したらでてきました.(~^;

スミマセンね.「動的」じゃなくて.

[942][04_実行時の HTML コード挿入]
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm#04


monaa  2013-03-12 23:59:12  No: 44022

なんか目的の対策が見当違いな気がします。
もし、やんわり防御するだけで良いのであれば、
ブラウザのUser Agentを判別してページを振り分けるのが王道かと。
ガチガチで行くならページソースを特殊エンコードにして、専ブラでデコードするとか、特殊なプレ通信を行うとか、いずれにせよ完璧な方法は無いとおもいますよ。


とも  2013-03-13 04:01:03  No: 44023

Mr.XRAYさん、ありがとうございます。

サンプルでは、TEmbeddedWB を使っていたので、使わないように修正して試してみました。
HTMLの最後に追加する事ができましたが、<form></form>間に入らず、POSTすることが
できませんでした。

〜〜ソース〜〜
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  Doc3: IHTMLDocument3;
  inputElements: IHTMLInputElement;
  SL          : TStringList;
  iElementCol : IHTMLElementCollection;
  iElement    : IHTMLElement;
begin
  Doc3 := WebBrowser1.Document as IHTMLDocument3;
  if Doc3.getElementById('form_submit') = nil then begin
    SL := TStringList.Create;
    try
      SL.Add('<input value="ログイン" name="submit" type="submit" id="form_submit" />');
      iElementCol := Doc3.getElementsByTagName('body');
      iElement    := iElementCol.item(0, 0) as IHTMLElement;
      iElement.insertAdjacentHTML('BeforeEnd', SL.text);
    finally
      FreeAndNil(SL);
    end;
  end;
end;
〜〜ソースここまで〜〜

ご教授頂いた内容を参考に、いろいろ試したところ、継続確認は、必要ですが、以下の内容でいけた感じです。

ありがとうございました。

〜〜ソース〜〜
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var
  Doc3: IHTMLDocument3;
  inputElements: IHTMLInputElement;
  SL          : TStringList;
  iElementCol : IHTMLElementCollection;
  iElement    : IHTMLElement;
begin
  Doc3 := WebBrowser1.Document as IHTMLDocument3;
  if Doc3.getElementById('form_submit') = nil then begin
    iElement := Doc3.getElementsBytagName('span').Item('submit',0) as IHTMLElement;
    iElement.innerHTML := '<input value="ログイン" name="submit" type="submit" id="form_submit" />';
  end;
end;
〜〜ソースここまで〜〜

monaaさん、IEなどからのアクセスをやんわりではなく、一切シャットアウトが目的である為、
このような対応を考えておりました。


助監督  2013-03-13 10:09:33  No: 44024

なんかmonaaさんの忠告を取り違えておられる気がするので、一応。

>IEなどからのアクセスをやんわりではなく、一切シャットアウトが目的

いえ、現在の対応は やんわり くらいだと思います。

たとえば適当なブラウザでログインページのURLにアクセスし、このようなブックマークレットを
実行すればSubmitボタンを動的に追加できてしまいます。
Javascript:document.getElementById('submit').innerHTML='<input type="submit" value="ログイン">';void 0;

追加を省略して直接submitしたほうが早いですね。
Javascript:document.getElementsByTagName('form')[0].submit();

実はJavaScriptを使わずとも、URIに書いて直接アクセスすれば最速。
私が「専ブラうぜぇ」と思ったら、これをブックマークしちゃいます。
http://www.twebbrowsertest.jp/login.php?login-id=MyID&password=Mypass1234

シャットアウトに近い思いつく限りでの現実的な方法としては、日時などを元にハッシュ/暗号化した
ログイン専用のワンタイムパスワードを作成、それをtype="hidden"に含めて送り、受け側で照合する …とか。
これならDelphiで専用ブラウザを作る意義が生きると
思います。
※ワンタイムパスワード生成部がマシン語で解析困難に出来るため。ダミーコードとか入れるとなお良し。

日時の同期とワンタイムパスワードの有効期間がポイントですね。
ログインフォームもSubmitボタンもDelphi VCLで用意し、ボタンが押されたらサーバー時刻の入った
(目に見えない)ページを取得、URIに各パラメータを仕込んですぐさまページ移動とかどうでしょう。
これなら有効期間10秒くらいでもいけるかと。

しかしこれだけしても、リアルタイムで通信を監視/介入されたらハック可能ですけどね。
そういう目的に近いものとしてはProxomitronというソフトが著名です。


確かに  2013-03-13 14:18:01  No: 44025

確かに今のままだと、単にURL晒されて終りでしょうね。
  グーグルにキャッシュでも拾われたら、履歴付きで誰でも見られるでしょうし。
(行儀の悪いクローラは、ロボットよけのおまじないも効果ありません。)

  いざとなったら漏れても構わない、という程度の情報ならよいでしょうが、
ダダ漏れになることが分かる作りをするのはどうかと思います。


根本から間違い  2013-03-14 01:35:46  No: 44026

一切のシャットアウトをしたいのであればそもそもTWebBrowserを使うべきじゃない
どうしてもHTMLで描画をしたいのなら、HTMLをやり取りする通信部分はブラウザ任せではなく、
Indyなど別の手段で行い、HTTPではないプロトコルを使ったり暗号化などをすべき。


とも  2013-03-16 06:17:50  No: 44027

実際の処理は、これだけでなく、ソケット通信で、POSTを行い、セッションを残す処理なども行っております。

また、一切のシャットアウトという条件も緩くなり、
URLがさらされたとしても、問題がないということになりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加