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

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

ただいまの
回答率

87.37%

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 862

score 28

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

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

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

<?php
//javascriptファイルとして処理させる
header("Content-type: application/x-javascript");
//IPアドレスを変数に代入
$adr = $_SERVER["REMOTE_ADDR"]);
//echo "var ipAddress = '" . $adr . "';";
if (!preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $adr) { 
    echo "var ip = TRUE;";
} else {
    echo "var ip = FALSE;";
}
?>
<HTML>
<head>
<script type="text/javascript" src="http://***/ip_checker.php"></script>
<script>
// IPアドレスがローカルアドレスでない場合は強制終了
$(document).ready( function(){
//    document.write(ipAddress);
//    alert(ipAddress);
    //ip=true; //終了させたい場合
    try {
        if(ip==true){
            throw new Error("この環境では使用できません。");
        }
    } catch(e) {
        alert(e.message); // エラーメッセージを表示
        exit;
    }
});
</script>
</head>
<BODY>

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kyoya0819

    2019/08/21 19:56

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

    キャンセル

  • kyoya0819

    2019/08/21 20:00

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

    キャンセル

  • hatsuzo

    2019/08/22 08:38

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

    キャンセル

回答 4

+2

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

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

Re: hatsuzo さん

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/22 09:07

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/22 11:31

    asahina1979さん。コメント有難うございます。

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

    キャンセル

  • 2019/08/22 12:17

    ファイアウォールを除くと

    ディレクトリ全体
    ファイル(完全一致)単位
    ファイル(部分一致)単位

    いずれも出来ます。

    ファイアウォールのソフトによってはHTTPヘッダーを解析して禁止することも可能です。

    ミドルウェア、ソフトウェア(フレームワークなど)の情報がないので設定方法は出しませんが

    キャンセル

0

<!DOCTYPE html>
<html>
<head>
<?php
$ia = $_SERVER["REMOTE_ADDR"];
// $ia = "xxx.xxx.xxx.xxx" テスト用 本番時は消してください。
if (preg_match('/^192.168.[0-9]{1,2}.[0-9]{1,3}$/', $ia)) { 
    echo "<script>var tf = true;";
} else {
    echo "<script>var tf = false;";
}
?>    
try {
  if(tf==false){
    alert("この環境では使用できません。");
  }
} catch(e) {
  alert(e.message);
}
</script>
</head>
<body>
hogehoge
</body>
</html>


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

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

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


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/22 10:22

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

    キャンセル

  • 2019/08/22 11:32

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

    キャンセル

  • 2019/08/22 11:37

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

    キャンセル

check解決した方法

-2

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

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

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

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

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

<script>
// IPアドレスがローカルアドレスでない場合は強制終了
$(document).ready( function(){
    var value1=x; // 意味なし
    var value2=y; // 意味なし
    $.ajax({
        type: 'post',
        url: "http://***/ip_checker.php",
        dataType: "json",
        data: {"value1": value1, "value2":value2},
    }).done(function (result) {
        //非同期通信に成功したときの処理
        //ip=true; //終了させたい場合
        try {
            if(result==true){
                throw new Error("この環境では使用できません。");
            }
        } catch(e) {
            alert(e.message); // エラーメッセージを表示
            $(".body").remove();    // コンテンツの強制削除
            exit;
        }
    }).fail(function (jqXHR, textStatus, errorThrown) {
        // 通信失敗時の処理
        alert('ajax通信に失敗しました。');
    });
});
</script>
<body>
<div class="body">
コンテンツの中身
</div>

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

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

画面表示の前に
<script type="text/javascript" src="http://***/ip_checker.php"></script>
を入れれば、画面表示することなく使用を拒否することが可能だったのですが、処理のタイミングが合わないのか、値を受け取ることが出来ませんでした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る