はじめまして、現在、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>
〜ここまで〜
よろしくおねがいいたします。
こんなところが参考になるでしょうか.
「HTML コード挿入 実行時 Delphi」で検索したらでてきました.(~^;
スミマセンね.「動的」じゃなくて.
[942][04_実行時の HTML コード挿入]
http://mrxray.on.coocan.jp/Delphi/plSamples/942_TEmbeddedWB.htm#04
なんか目的の対策が見当違いな気がします。
もし、やんわり防御するだけで良いのであれば、
ブラウザのUser Agentを判別してページを振り分けるのが王道かと。
ガチガチで行くならページソースを特殊エンコードにして、専ブラでデコードするとか、特殊なプレ通信を行うとか、いずれにせよ完璧な方法は無いとおもいますよ。
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などからのアクセスをやんわりではなく、一切シャットアウトが目的である為、
このような対応を考えておりました。
なんか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というソフトが著名です。
確かに今のままだと、単にURL晒されて終りでしょうね。
グーグルにキャッシュでも拾われたら、履歴付きで誰でも見られるでしょうし。
(行儀の悪いクローラは、ロボットよけのおまじないも効果ありません。)
いざとなったら漏れても構わない、という程度の情報ならよいでしょうが、
ダダ漏れになることが分かる作りをするのはどうかと思います。
一切のシャットアウトをしたいのであればそもそもTWebBrowserを使うべきじゃない
どうしてもHTMLで描画をしたいのなら、HTMLをやり取りする通信部分はブラウザ任せではなく、
Indyなど別の手段で行い、HTTPではないプロトコルを使ったり暗号化などをすべき。
実際の処理は、これだけでなく、ソケット通信で、POSTを行い、セッションを残す処理なども行っております。
また、一切のシャットアウトという条件も緩くなり、
URLがさらされたとしても、問題がないということになりました。
ツイート | ![]() |