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

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

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

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

JavaScript

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

Q&A

解決済

2回答

943閲覧

PHPで発行したトークンをJavaScriptの変数に代入するとディベロッパーツールのSourcesで見えてしまう

ringoame49

総合スコア46

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2020/05/19 11:15

編集2020/05/19 12:50

質問失礼します。

ボタンをクリックするとデータベースのあるカラムの数字がインクリメントされていくプログラムを作っています。
下記のように作っています。

index.php

<button id="fini" data-clickcount="<?=$fini?>">クリック回数:<?=$fini?></button>

$finiはデータベースから取得した整数を入れています。

index.phpに記述しているScript

$('#fini').on('click', function(){ var token = "<?php echo $token;?>"; $.ajax({ url: "./count-up.php", type: "POST", data: {"token":token} }).done(function(){ var fini = document.getElementById("fini"); var number = fini.dataset.clickcount; newNumber = parseInt(number) + 1; fini.setAttribute('data-clickcount', newNumber); fini.textContent="クリック回数:" + newNumber; }) });

var token = "<?php echo $token;?>";の部分で見えてしまいます。

count-up.php

$token = $_POST['token']; if($token == "" || $token != $_SESSION['token']){ header("Location: index.php"); exit(); } //以下DBのカラムをインクリメントをするコード

count-up.phpを直接検索された時の為にif($token == "" || $token != $_SESSION['token'])を設定しています。
上記を設置した経緯は、
count-up.phpを直接検索された場合、indexにリダイレクトさせようと思い、POSTが空ならと思いましたが、それだとPOSTに適当な値が入っていてもif文を通過出来てしまうため、ランダムな値をSESSIONに入れそれが一致していなければその場合もリダイレクトが出来ると思って使いました。

しかし上記やり方だとトークンがディベロッパーツールのSourcesで見えてしまいます。
それは見えたトークンと一緒の値をPOST送信出来てしまうのでは?と思いました。

これを見えなくするには何か良い方法はないでしょうか?
または、count-up.phpを直接検索された時の対処法で他に何かあるのでしょうか?

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

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

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

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

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

m.ts10806

2020/05/19 12:04

何のためにトークンを使っているかはきちんと把握されたうえですよね?
ringoame49

2020/05/19 12:45

今回は初めにcount-up.phpを直接検索された場合、indexにリダイレクトさせようと思い、POSTが空ならと思いましたが、それだとPOSTに適当な値が入っていてもif文を通過出来てしまうため、ランダムな値をSESSIONに入れそれが一致していなければその場合もリダイレクトが出来ると思って使いました。
m.ts10806

2020/05/19 12:47

トーク使いたい背景や前提として質問本文に追記された方が良いかと思います。
ringoame49

2020/05/19 12:48

かしこまりました!
guest

回答2

0

これを見えなくするには何か良い方法はないでしょうか?

実質的にはありません。どれだけ隠そうとしても、「Network」で送信しているところを確認すればすぐに確認できます。

または、count-up.phpを直接検索された時の対処法で他に何かあるのでしょうか?

「count-up.phpを直接検索された」だけであれば、トークンはわからないので何も起きません。

どれだけ守りたいかを決めることが先決です。

投稿2020/05/19 11:18

maisumakun

総合スコア145184

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

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

ringoame49

2020/05/19 11:25

ご回答ありがとうございます。 確かに直接検索されただけではトークンはわからないので問題ないですね。 ただ今回のプログラムを作っていて思ったのですが、JavaScriptでPOSTされたトークンが分かってしまったら SESSIONに入れたトークンと簡単に一致させてしまえるのが問題かな?と思いました。
maisumakun

2020/05/19 11:27

それが、どれほどの「問題」なのかが、自分には把握できません。 本文にあるように、「どれだけ守りたいか」によって、取るべき対策は違ってきます。
ringoame49

2020/05/19 12:47

>それが、どれほどの「問題」なのかが、自分には把握できません。 見えるということは偽装できるということなのかな?と思っています。 守りたい内容はcount-up.phpを直接検索された場合index.phpにリダイレクトし、データベースが更新されないことです。
maisumakun

2020/05/19 13:28

ページを開いて送信すればトークンは判明しますが、それを使って何度も送信する…というようなシチュエーションは対策が必要でしょうか?
maisumakun

2020/05/19 13:28

「count-up.phpを直接検索された場合」はトークンが入らないので、現状で問題ありません。
ringoame49

2020/05/20 10:11

>「count-up.phpを直接検索された場合」はトークンが入らないので、現状で問題ありません。 でしたら確かに問題ないですね。 何度もコメントありがとうございました。
guest

0

ベストアンサー

これを見えなくするには何か良い方法はないでしょうか?

無いです。

または、count-up.phpを直接検索された時の対処法で他に何かあるのでしょうか?

質問中にある

ランダムな値をSESSIONに入れ

という処理を
count-up.php
でトークンの認証が終わったあとに再度実行し(=トークンは一度しか使えないようにする)、JavaScript側の値も更新すれば、仮に直接POSTされたとしても問題は無いはずです。

フォームのワンタイムトークンはCSRF対策としてよく使われますのでPHP CSRF 対策 ワンタイムトークンあたりで調べると原理が把握できるかと思います。

原理を把握して通常の画面移動を伴うフォームでサンプルを作ってみてから(ライブラリも多くあるので、活用すると楽です)、現在のアプリケーションに組み込む検討をすることをお勧めします。


要件をもっと緩くして良いのであれば、サーバサイドで管理している値だけでアクセス制御することは可能です。
この場合はトークンは必要ありません。

例えば、

  1. アクセスしたページや時間をセッションに等に全て記録する
  2. count-up.phpにアクセスした時の直近のアクセス履歴を調べ、index.phpにアクセス直後、もしくはindex.php→count-up.php(任意の連続した回数)の後にアクセスしている時だけカウントアップを許可する

という様な感じです。

投稿2020/05/19 17:03

tanat

総合スコア18713

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

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

ringoame49

2020/05/20 10:13

>count-up.phpでトークンの認証が終わったあとに再度実行し(=トークンは一度しか使えないようにする)、JavaScript側の値も更新すれば、 上記の方法を試してみます。 この度はご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問