🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

3166閲覧

JavaScript サーバーの時間をリアルタイムに取得

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

1クリップ

投稿2019/10/15 23:25

ある一定の期間内までしか使用できないJavaScriptを開発します。
今回の目的はサーバーの時間をリアルタイムで取得したいと思っています。
コンピュータのクライアントの時間を使用すると、不正に使用ができてしまうからです。


↓のスクリプトではサーバーの時間を取得できるかと思い実行したら、
結果が常に同じになってしまいました。どうすればサーバーの時間をリアルタイムに取得できるのでしょうか?
※JavaScriptは難読化したいのでJQueryは使用したくありません。

以下のスクリプトです。

javascript

1// *** リアルタイム処理 *** // 2function loop() { 3 var request = new XMLHttpRequest(); 4 request.open('HEAD', window.location.href, true); 5 request.send(); 6 request.onreadystatechange = function() { 7 if (this.readyState === 4) { 8 var hTime = request.getResponseHeader('Date'); 9 window.alert(hTime); 10 } 11 } 12} 13setInterval(loop, 1);

よろしくお願いします。

isokaze👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

コンピュータのクライアントの時間を使用すると、不正に使用ができてしまうからです。

クライアントサイドのJavaScriptはソースコードをすべてクライアントサイドに送っているので、サーバサイドとのやり取りなしで動かせるコードの場合、「サーバサイドでのチェックを止める」という改造もできてしまいます。

いくら難読化したところで気休め程度にしかならないです。厳格な時間チェックが必要なら、コアになる部分をサーバサイド処理にして、サーバとの通信がなければプログラムが動かないような作りにしておく必要があります。

投稿2019/10/16 00:05

maisumakun

総合スコア145975

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

loop() の中だけをコピーしてコンソールで実行してみましたが、問題なく動作しているように思います。

setIntervalの第2引数はミリ秒なので、ご指定の setInterval(loop, 1) だと1秒間に1000回リクエストを送ることになっています。1秒経っただけで1000回のリクエストと1000回のアラートがスタックされていって、1000回OKを押さないと表示内容が変わらない(次の秒の表示にならない)と思いますが、こちらが原因ではないでしょうか?

投稿2019/10/16 00:00

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/10/16 00:17 編集

私も、setIntervalの値を500ミリ秒、window.alert()ではなく、document.write()で出力するようローカル環境で試したのですが、たまにキャッシュが効いているのか、HEADリクエストが送信されないときがありました。ただ、そもそも1ミリ秒単位でリクエストを出そうとする行為はサーバーに対するアタックに近い気がしました。
thyda.eiqau

2019/10/16 00:25

はい、現時点ではなんとも言えないところもありますが、まずは1ミリ秒の指定を適切に変えて (500か1000か……) どうなるかを確認してもらうしかないですね。ブラウザ側でリクエストを送る送らないというのがあるかもしれないし、サーバー側で止めているかもしれないし、そのあたりの確認は次のステップですね
kyoya0819

2019/10/16 00:26

1ミリ秒なんて単なる攻撃です。 (やってみましたがサーバーと端末双方に負荷がかかってました)
dodox86

2019/10/16 00:34

asuchi0819さん、追試のフォローをいただきましてありがとうございます。ご提示いただいたコードと私も同じです。1ミリ秒間隔の是非(<非しかありませんが)は置いておいて、キャッシュが効いてしまっているときはどうもGETリクエストが送信されているケースがあるようでした。ブラウザーの問題かと思いました、深くは追いませんが、XMLHttpRequest.openでHEADメソッドを指定してるのに、謎の挙動です。
dodox86

2019/10/16 00:39

記録の為、試したブラウザー情報を記しておきます。Google Chrome 77.0.3865.120(64bit Windows 7上で稼動)
kyoya0819

2019/10/16 00:41

自分もたどたどしくなってます。 iOS12.4.1, iPad6, Safar604.1
kyoya0819

2019/10/16 01:38 編集

とりあえず100回やった結果です。
guest

0

サーバーの時間をリアルタイムに取得

サーバー側でapiを用意し時間を取得できるようにしてajaxやfetchで
バックグラウンドで非同期にうけとってください
ただし、クライアント側から頻繁に時間の問い合わせをするのは
ただの攻撃と変わりません。
そう頻繁にサーバーの時間がずれることはありませんので
多くて1分に1回くらいじゃないですかね?

基本的にはjsに期間制限を設けるのは現実的ではありませんが
実行キーのようなものをサーバーから受け取れば
なんとなくできないこともないのかなとは思います。

投稿2019/10/16 00:30

yambejp

総合スコア116694

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

みなさんありがとうございます。
どうやらURLによってはサーバーの時間がフリーズ(固定)されてしまうことが分かりました。
それと回答にあった setInterval は (loop, 1000); に変更しました。
本当にありがとうございました。

投稿2019/10/16 08:56

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問