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

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

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

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

JavaScript

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

Q&A

解決済

3回答

2632閲覧

jsゲームで得点をサーバーに送る時、偽造されないようにするには

webgoto

総合スコア1293

PHP

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

JavaScript

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

0グッド

0クリップ

投稿2016/09/08 07:16

編集2016/09/08 08:54

JavaScript(jQeury)を使用し、スロットのゲームを作りました。
イメージ説明
3箇所の数字をクリックして、その結果をサーバーにajaxで送信します。

プログラム

php

1<span id="slot1" class="slot"></span> 2<span id="slot2" class="slot"></span> 3<span id="slot3" class="slot"></span> 4 5<script> 6$(function(){ 7 8 var stop = 0; 9 10 //スロット動かす 11 var slot1_timer = setInterval(function(){ 12 $('#slot1').text(Math.floor(Math.random()*10)); 13 }, 100); 14 var slot2_timer = setInterval(function(){ 15 $('#slot2').text(Math.floor(Math.random()*10)); 16 }, 100); 17 var slot3_timer = setInterval(function(){ 18 $('#slot3').text(Math.floor(Math.random()*10)); 19 }, 100); 20 21 //スロット止める 22 $('#slot1').one('click', function(){ 23 clearInterval(slot1_timer); 24 if(++stop === 3){ 25 sendPoint(); 26 } 27 }); 28 $('#slot2').one('click', function(){ 29 clearInterval(slot2_timer); 30 if(++stop === 3){ 31 sendPoint(); 32 } 33 }); 34 $('#slot3').one('click', function(){ 35 clearInterval(slot3_timer); 36 if(++stop === 3){ 37 sendPoint(); 38 } 39 }); 40 41 //得点送信 42 var sendPoint = function(){ 43 $.post( 'http://example.net/point/',{ 44 point: $('.slot').text(), 45 token: '<?php echo $_SESSION['token'] = sha1(uniqid(mt_rand(), true)); ?>' //CSRF対策 46 }); 47 }; 48 49}); 50</script>

その際、ソースコードを読むと
http://example.net/point/に
POST送信でpointとtokenの値を送ればよい事がわかってしまい、
pointを好きな値でリクエストを送れば、得点の偽造が出来てしまいます。

得点を正確に取得する方法はありますでしょうか。
ポイントを受け取るサーバーサイドはPHPを使用します。

よろしくお願い致します。

###追加質問

そもそも今回のプログラムはアルゴリズムの時点で実現不可であるとわかりました。
今回のゲームとは関係なく
インタラクティブにクライアント側からサーバー側にデータを送る時の
ロジックの参考になるような
サイトや書籍、検索キーワードなどはありますでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答3

0

JavaScriptの性質上、原理的に不可能です。

JavaScriptで実行するとなると、ブラウザ側で実行する=ブラウザにコードを送信している状態なので、どんな暗号化アルゴリズムを実行しようとも、アルゴリズムも鍵も入手可能となるため、意味がありません。

不正を完全に防ごうとすれば、PHPで得点や結果まで決めておいて、JavaScriptはそれを表示するだけ、という方法しかなさそうです。

投稿2016/09/08 07:46

maisumakun

総合スコア145121

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

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

webgoto

2016/09/08 08:54

今回のやり方ではjsの仕様上、無理なのですね。 根本から間違っていることがわかり、良かったです。 利用している時は気づかなかったですが、他のサービスではサーバーで処理したデータをうまく使用しているのですね。 ご回答ありがとうございました。
guest

0

ベストアンサー

この手の処理は結果をクライアントサイドで確定してはいけません。
ajaxで常にサーバーからデータをもらい、サーバー側でセッションでデータを持てば
クライアント側で操作することはできません。

#追記
一応、簡単なサンプル書いときますね
slot.htm

HTML

1<style> 2span { 3display:table-cell; 4width:100px; 5height:100px; 6text-align:center; 7vertical-align:middle; 8font-size:80px; 9border:1px solid #000000; 10} 11</style> 12<script src="jquery.js"></script> 13<script> 14var data={}; 15var done={}; 16var timer_id={}; 17$(function(){ 18 $('.slot').each( function(){ 19 var id=$(this).prop('id'); 20 done[id]=false; 21 }); 22 $('#start').click(function(){ 23 for(i in done){ 24 if(done[i]) return false; 25 } 26 clearData(); 27 $('.slot').each( function(){ 28 var id=$(this).prop('id'); 29 if(!done[id]){ 30 clearInterval(timer_id[id]); 31 timer_id[id] = setInterval(function(){ $('#'+id).text(Math.floor(Math.random()*10));}, 100); 32 done[id]=true; 33 } 34 }); 35 }); 36 $('.slot').click( function(e){ 37 var id=$(this).prop('id'); 38 if(typeof(data[id])=="undefined" && done[id]){ 39 setData(id); 40 } 41 }); 42}); 43function clearData(){ 44 $.ajax({ 45 url : "get.php", 46 type:"post", 47 dataType:"json", 48 data :{"t":(+new Date())}, 49 }); 50 data={}; 51} 52function setData(id){ 53 $.ajax({ 54 url : "get.php", 55 type:"post", 56 dataType:"json", 57 data :{"v":id,"t":(+new Date())}, 58 success: function(msg){ 59 data[id]=msg[id]; 60 clearInterval(timer_id[id]); 61 $("#"+id).html(msg[id]); 62 done[id]=false; 63 }, 64 }); 65} 66</script> 67<span id="slot1" class="slot">0</span> 68<span id="slot2" class="slot">0</span> 69<span id="slot3" class="slot">0</span> 70<input type="button" id="start" value="start"> 71

get.php

<?PHP session_start(); $v=filter_input(INPUT_POST,"v",FILTER_VALIDATE_REGEXP,["options"=>["regexp"=>"/^slot[0-9]+$/","default"=>null]]); if(is_null($v)){ unset($_SESSION["data"]); print json_encode(null); }else{ $_SESSION["data"][$v]=mt_rand(0,9); print json_encode($_SESSION["data"]); } ?>

投稿2016/09/08 08:50

編集2016/09/09 02:38
yambejp

総合スコア114572

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

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

webgoto

2016/09/08 09:05

サーバー側で数値を決めた場合、 利用者が数字が見えたタイミングで押しても、関係ない数字がでてしまうので、方法はないかなと思いまして。 (この切り替え速度では見て押せる人はいないでしょうけど…) やはり根本が間違っていましたね。 ご回答ありがとうございました。
webgoto

2016/09/09 03:05

サンプルのプログラムありがとうございます。 いろいろ試してみたいと思います。
guest

0

コメントで

サーバー側で数値を決めた場合、
利用者が数字が見えたタイミングで押しても、関係ない数字がでてしまう

とありますが、クリックしたタイミングでスロットが徐々に止まるようにアニメーションをゆっくりにしていき、そのタイムラグの間にサーバで決定した値を表示するというふうにするのはどうでしょうか?
演出でユーザーの体感を変えるというか…

あくまでも見えた数字をビシッと目押しするゲームなのであればダメですかね

投稿2016/09/09 01:28

NatsumiOki

総合スコア1298

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

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

webgoto

2016/09/09 03:04

なるほど、見せ方の方法、参考になりました。 実現できること、出来ないことを考えて仕組みを作らないといけないですね。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問