Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/83-53116ffb

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

『セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)』


『セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)』

IEでダウンロードしようとすると、時折お目にかかるが、自分で書いたhtmlで出した事は無かった。

#!/usr/local/bin/ruby
require 'cgi'
require "erb"
cgi=CGI.new('html3')
if cgi.has_key?('dl') then
file='damy.zip'
cgi.out('status'=>'OK'){file}
else
cgi.out('status'=>'OK'){ERB.new(DATA.read).result(binding)}
end
__END__
<html>
<body>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
function onButtonClick(){
new Ajax.Request('<%= ENV['SCRIPT_NAME'] %>',{
method: "post",
postBody: "dl=true",
onSuccess: function(http){
location.href = http.responseText;
}
});
}
</script>
<form>
<input type="button" onClick="onButtonClick()" value="DownLoad"
</form>
</body>
</html>

上記は、[DownLoad]ボタンを押下すると、cgiを呼んで、レスポンスに記されたファイル(URL)を
ダウンロードする。
これをIEで動作させると、

『セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)』

が出現し、移動先がブロックされてしまう。
『ファイルのダウンロード』を選択しても、ブロックが解除されて次のフェーズへ進むのではなく、
再度ボタンを押下するところからやり直さなくてはならず、ユーザーフレンドリーでない。

※ IEのセキュリティ設定をデフォルトから変えれば、挙動は変わってくる。
※ 2度目からは、そのようなことは無い。

これを何とかしたいと思い、色々と裏道を探してみたが、回避作は無いようだ。。ORZ

せめて、ボタンを最初に押した時だけ、以下の様なアラートを出したい。(2度目からは出したくない)

セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)
の表示が出た場合、『ファイルのダウンロード』を選択し、
再度[DownLoad]ボタンを押してください。

そこで、以下の様に書いてみた。

#!/usr/local/bin/ruby
require 'cgi'
require "erb"
require 'rubygems'
require 'sqlite3'

def randomStr(size)
a=('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
Array.new(size){
a[rand(a.size)]
}.join
end

DBFILE='./dl.db'
unless File.exist?(DBFILE) then
db = SQLite3::Database.new(DBFILE)
db.execute('create table table01 (key text,cnt integer)')
else
db = SQLite3::Database.new(DBFILE)
end

cgi=CGI.new('html3')
if cgi.has_key?('key') then
db.execute('delete from table01 where key=? and cnt=1',cgi['key'])
db.execute('update table01 set cnt=1 where cnt=0 and key=?',cgi['key'])
cnt = db.execute('select cnt from table01 where key=?',cgi['key'])[0]
cgi.out('status'=>'OK'){'{url: "' + 'damy.zip' + '",cnt: ' + (cnt ? cnt.to_s : '0') + '}'}
else
rstr=randomStr(16)
db.execute('replace into table01 (key, cnt) values(?, ?)',rstr,0)
cgi.out('status'=>'OK'){ERB.new(DATA.read).result(binding)}
end
__END__
<html>
<body>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
var key = '<%= rstr %>';

function onButtonClick(){
new Ajax.Request('<%= ENV['SCRIPT_NAME'] %>',{
method: "post",
postBody: "key=" + key,
onSuccess: function(http){
try{
var json = eval("("+http.responseText+")");
}catch(e){
alert('err');
}
if(window.ActiveXObject && json.cnt == 1)
alert("セキュリティ保護のため、このサイトによる、コンピューターへの・・・(省略)\nの表示が出た場合、『ファイルのダウンロード』を選択し、再度[DownLoad]ボタンを押してください。");
location.href = json.url;
}
});
}
</script>
<form>
<input type="button" onClick="onButtonClick()" value="DownLoad"
</form>
</body>
</html>


javascript内にカウンターを持たせて解決と思ってたのだが、IEはlocation.hrefの後のブロックで、
javascriptをロードしなおすので、(javascriptを<head>に置いても、結果は同じ。)
サーバ側にカウンタを持たせた結果、大仕掛けに。。。なんか、もっといい方法ないかなぁ。

後日記はこちら
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/83-53116ffb

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。