質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Q&A

解決済

4回答

1795閲覧

Javascriptのページを開いた時にIPアドレスを取得したい

hatsuzo

総合スコア56

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

0グッド

0クリップ

投稿2019/08/21 09:48

いつもお世話になっております。

簡易的に特定のIPアドレス以外からのアクセスを拒否するような処理を組み込もうと思っています。
phpのページでは問題なく実装できたのですが、php環境のないサイトで、
Javascriptで作っているぺージがうまく出来ないので、お知恵を拝借したいと存じます。

https://teratail.com/questions/134744
を拝見し、その中にもリンクされているページを参考にして判らないがままに実装してみました。

php

1<?php 2//javascriptファイルとして処理させる 3header("Content-type: application/x-javascript"); 4//IPアドレスを変数に代入 5$adr = $_SERVER["REMOTE_ADDR"]); 6//echo "var ipAddress = '" . $adr . "';"; 7if (!preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $adr) { 8 echo "var ip = TRUE;"; 9} else { 10 echo "var ip = FALSE;"; 11} 12?>

html

1<HTML> 2<head> 3<script type="text/javascript" src="http://***/ip_checker.php"></script> 4<script> 5// IPアドレスがローカルアドレスでない場合は強制終了 6$(document).ready( function(){ 7// document.write(ipAddress); 8// alert(ipAddress); 9 //ip=true; //終了させたい場合 10 try { 11 if(ip==true){ 12 throw new Error("この環境では使用できません。"); 13 } 14 } catch(e) { 15 alert(e.message); // エラーメッセージを表示 16 exit; 17 } 18}); 19</script> 20</head> 21<BODY>

という感じです。
PHP側でOKかNGかを判定し、Javascript側で、エラーの場合は、ダイヤログでメッセージを出した後に、htmlの内容を表示させずに終わらせることをもくろんでいます。

try以降のメッセージ表示処理は、ともかくとして、
// document.write(ipAddress);
// alert(ipAddress);
の部分の、phpのページから値が受け取れない状態です。

フォームを開いた時点での実行するタイミングの問題なのでしょうか?

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

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

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

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

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

kyoya0819

2019/08/21 10:56

強いて言わせていただくと見ようと思えば誰でも見れてしまうのは承知の上でしょうか?
kyoya0819

2019/08/21 11:00

まぁどうしても見たくないと言われたら根本的に作り直す必要がありそうですが
hatsuzo

2019/08/21 23:38

コメントありがとうございます。 承知の上です。 言葉たらずでしたが、このページ自体は、VPN内でのみ参照できる場所に置いているので、 社外では見えないことを前提としています。
guest

回答4

0

回りくどい事をせずとも、PHPで強制終了させればよいと思います。

コンテンツをWebブラウザにDLさせた時点で秘匿性は担保されません。

Re: hatsuzo さん

投稿2019/08/21 11:59

think49

総合スコア18164

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

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

hatsuzo

2019/08/22 00:07

コメントありがとうございます。 phpを同じページ内で書ければ可能だと思いますが、別ページで書くことを前提としているので、そのページが終わるだけだと思います。
guest

0

ファイアウォールかhtaccess,httpdの設定ファイルで制御

投稿2019/08/21 23:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hatsuzo

2019/08/22 02:31

asahina1979さん。コメント有難うございます。 これも後出しの前提条件のようで申し訳ないですが、 ファイヤウォールではサーバー単位、 .htaccessはディレクトリ単位のアクセス制御になると思います。 今回の対象は同じディレクトリ内の特定ページに限定されるため、 残念ながら使えません。 ということでページ内で実装するしかないかなと思ったわけです。
退会済みユーザー

退会済みユーザー

2019/08/22 03:17

ファイアウォールを除くと ディレクトリ全体 ファイル(完全一致)単位 ファイル(部分一致)単位 いずれも出来ます。 ファイアウォールのソフトによってはHTTPヘッダーを解析して禁止することも可能です。 ミドルウェア、ソフトウェア(フレームワークなど)の情報がないので設定方法は出しませんが
guest

0

PHP

1<!DOCTYPE html> 2<html> 3<head> 4<?php 5$ia = $_SERVER["REMOTE_ADDR"]; 6// $ia = "xxx.xxx.xxx.xxx" テスト用 本番時は消してください。 7if (preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $ia)) { 8 echo "<script>var tf = true;"; 9} else { 10 echo "<script>var tf = false;"; 11} 12?> 13try { 14 if(tf==false){ 15 alert("この環境では使用できません。"); 16 } 17} catch(e) { 18 alert(e.message); 19} 20</script> 21</head> 22<body> 23hogehoge 24</body> 25</html>

こんなのどうですか?
2つに分ける意味が少しわかりませんでした。
まぁ、これでも見ようと思えば見られてしまう欠点はありますけど

秘密にしたいならこっちの方がまだ良いかも

PHP

1<!DOCTYPE html> 2<html> 3<head> 4<?php 5$ia = $_SERVER["REMOTE_ADDR"] ; 6if (preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $ia)) { 7 echo "ここに表示する内容を記述"; 8} else { 9 echo '<script>try{alert("この環境では使用できません。");}catch(e){alert(e.message);}</script>'; 10} 11?> 12</head> 13<body> 14hogehoge 15</body> 16</html>

セキュリティは実装時に必ず確認してください。

投稿2019/08/21 11:40

編集2019/08/21 12:10
kyoya0819

総合スコア10429

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

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

hatsuzo

2019/08/21 23:47

コメントありがとうございます。 phpが使える環境ならおっしゃる通りの方法でできるのですが、このページは、phpの使えないサーバー(フレームワークの動くパッケージが入っておりインストールできない)にあり、かつ、このページもフレームワーク上の環境で動いています。 このため、別ページで取ったIPアドレスないし判定の情報を受け取れないので困っているわけです。
退会済みユーザー

退会済みユーザー

2019/08/21 23:55

Php使えないのに質問者は使っているコードをあげる不思議
hatsuzo

2019/08/22 00:01

コメントありがとうございます。 <script type="text/javascript" src="http://***/ip_checker.php"></script> ですから別のサーバーを呼び出しているんですが....
退会済みユーザー

退会済みユーザー

2019/08/22 00:41

特定のFWで作られた場合、同一のホストでも プロトコル(http/https etc..) で始める場合があるので あと、質問者が明示的に言わない場合は 質問にある <script> タグのパスは確認する人は少ないと思うが(今ついている回答をみてわかるように)
kyoya0819

2019/08/22 01:22

それだったら一回リダイレクトさせた方が楽な気がするけど
hatsuzo

2019/08/22 02:32

asahina1979さん。 確かに仰る通り判りにくいですね。失礼しました。
hatsuzo

2019/08/22 02:37

asuchi0819さん。 有難うございました。 リダイレクトというのは、呼び出したphpから元のページに転送する、という意味ですね。 フレームワーク上で動作しているページなので、セッションがどうなるのかよく判りませんが、ちょっと考えてみます。
guest

0

自己解決

コメントを何人かの方々から頂きまして有難うございました。

結局、決してスマートなやり方ではないと思いますが、下記の方法でなんとか動かしまsいています。

まず、ipアドレスを取得するのは、上述の通り、別サーバーにあるphpスクリプトを呼び出します。

php

1<?php 2header("Access-Control-Allow-Origin: *"); 3//IPアドレスを変数に代入 4$adr = $_SERVER["REMOTE_ADDR"]; 5if (!preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $adr)) { 6 // アクセス拒否 7 $result = "true"; 8} else { 9 $result = "false"; 10} 11echo $result; 12exit; 13?>

結果は、Javascriptからajax通信で呼び出すことによって値を受け取ることができました。

html

1<script> 2// IPアドレスがローカルアドレスでない場合は強制終了 3$(document).ready( function(){ 4 var value1=x; // 意味なし 5 var value2=y; // 意味なし 6 $.ajax({ 7 type: 'post', 8 url: "http://***/ip_checker.php", 9 dataType: "json", 10 data: {"value1": value1, "value2":value2}, 11 }).done(function (result) { 12 //非同期通信に成功したときの処理 13 //ip=true; //終了させたい場合 14 try { 15 if(result==true){ 16 throw new Error("この環境では使用できません。"); 17 } 18 } catch(e) { 19 alert(e.message); // エラーメッセージを表示 20 $(".body").remove(); // コンテンツの強制削除 21 exit; 22 } 23 }).fail(function (jqXHR, textStatus, errorThrown) { 24 // 通信失敗時の処理 25 alert('ajax通信に失敗しました。'); 26 }); 27}); 28</script> 29<body> 30<div class="body"> 31コンテンツの中身 32</div>

ただ、画面が表示されてしまった後で、エラーが返ってきてしまうため、表示された画面をjQueryで強制的にクリアしました。表示画面は参照できても問題ない、という前提付きです。

ajax通信の値があまりにも遅い場合は、メッセージが表示される前に、表示された画面に処理をしてしまうと何の意味もないですが、その余地もない位にエラー表示が行われ、クリア処理が終わります。

画面表示の前に

<script type="text/javascript" src="http://***/ip_checker.php"></script>

を入れれば、画面表示することなく使用を拒否することが可能だったのですが、処理のタイミングが合わないのか、値を受け取ることが出来ませんでした。

投稿2019/08/22 07:34

hatsuzo

総合スコア56

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問