ブラウザのJavaScriptアプリと別サーバのAPI(php)を連携させてちょっとしたデータ(ゲームのスコア)を別サーバのデータベースへ登録させようと思っ

ブラウザのJavaScriptアプリと別サーバのAPI(php)を連携させてちょっとしたデータ(ゲームのスコア)を別サーバのデータベースへ登録させようと思っ ています。 その時にある程度不正を防ぐために、javaScriptアプリ上以外からの接続拒否しようかと考えています。(javaScriptアプリを経ずにAPIを直接送信してスコア登録されないようにしたい) どのようなやり方があるでしょうか? 何らかのAPI通信用のキー的な合言葉を付加しようともしましたが、JavaScript使用前提なので難読化したところでソースは見られてしまうので合言葉的なものはバレてしまうかと考えています。 また調べて見たところ今回のケースにハマるかよくわかっていませんが、Oauth2.0というのものがあるらしいのですが以下のようなサービスや実装はちょっと実装ハードル高く実装規模からもオーバースペックだと考えています。どこかのSNSとアカウント連携もユーザーの手間を考えるとちょっとハードル高いと考えています。 https://www.okta.com/jp/ https://tech-lab.sios.jp/archives/8091 curl等を使って外部から簡単にスコア登録されるのを防ぐ程度の防御策で良いと考えているのですが、何か良いやり方はありますでしょうか ? 宜しくお願いします。

JavaScript | PHP40閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

1

> ブラウザのJavaScriptアプリと別サーバのAPI(php)を連携 先ずは、単純にやるとクロスドメインへのアクセスは出来ないんじゃないかと思うので、それの対応が必要だと思います。 __本旨ではないので検索してみてください > javaScriptアプリ上以外からの接続拒否 多くの AJAXは X-Requested-Withヘッダに XMLHttpRequestをセットしているので、このヘッダを見て AJAXである事を判断しています。 別にこれでなくても構わないので、自由に設定してサーバ側でチェックすればいいです。 ですが、詐称も簡単にできてしまいますし、「ソースを見てわかるものはダメ」にも引っ掛かります。 同一サーバならセッションを先に仕込んでおくことが出来るなら手間が掛からないですが、その JavaScriptを仕込む段階までにサーバ側でのアクションが必要です。 __そうじゃないと固定値しか設定できない 更に、「別サーバ」にセッションを引き回すのは結構面倒だと思います。 > 以下のようなサービスや実装はちょっと実装ハードル高く実装規模からもオーバースペック 正当な接続であるかの確認が取れていないと、質問者さんが危惧している不正な接続は排除できないでしょう。 しかし、その確認を単純なアクセス(例えば単に Cookieを拾ってくるとか)にしてしまうと、簡単に模倣されてしまうので意味が無いです。 なのにその辺りの実装を避けるのでは、手が無いと思いますよ? IPでの制限は携帯電話(テザリングを含む)はアウトでしょうしねぇ。

1人がナイス!しています

お返事ありがとうございます。 クロスドメインに関しての注意ありがとうございます。確認しておきます。また、X-Requested-Withヘッダもその通りですね。チェック項目に入れておきたいと思います。 同一サーバのセッション使用に関しては、恐らくshimixさんと同じ感じのことをおっしゃってるのだと理解しました。 こうやってみよう、というのをshimixさんへの返信にも書いてみました。これでいけそうかなと考えていますがご意見あればいただければと思います。 (そして、正規のOauth2.0を使おうというのは全く、その通りだと思いますう〜。。)

その他の回答(4件)

1

一番簡単な方法は、まずAPIをAjaxにして、xhttp以外のリクエストを無条件にはじくことです。 これだけでCORS(同一ドメイン制約)が発動し、外部サイトやアプリは接続できなくなります。 また、CSRF(クロスサイトリクエストフォージェリ)対策として、フォーム生成時にセッションIDをフォームに埋め、送信後にその値を検証します。 他にもオースコードを書き込んで同一値であるかを検証することもあります。 個人的には、各種のスクレイピング対策もあるので、Ajaxの徹底的な利用をおすすめします。 受送信されるjsonを暗号化すればほとんど突破は不可能になりますので。

1人がナイス!しています

0

現状ではhttpsが強力な暗号を提供しますが、サーバーが対応してないと使えません。 今さら聞けないIT用語:httpとhttpsの違いとは? httpsならば安全? https://data.wingarc.com/http-and-https-25449#:~:text=%E3%81%8B%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84%E3%81%8B%E2%80%9D-,http%E3%81%A8https%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF%E2%80%9C%E9%80%9A%E4%BF%A1%E5%86%85%E5%AE%B9%E3%81%8C%E6%9A%97%E5%8F%B7,%E6%89%8B%E9%A0%86%E2%80%9D%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%BE%E3%81%99%E3%80%82 現実的な代替案としては暗号化ライブラリを使う(この暗号化は貧弱です)、当然 不正なデータ(復号化できないデータ)は弾く。 httpsにしろ暗号化ライブラリにしろ、サーバー自体がハッキングされたら意味無いですが。

1

JavaScriptと同じサーバに中継用のphpスクリプトを置く(同一サーバなのでセッションも使える) 中継スクリプトが別サーバに送るときはサーバ間のやりとりなので認証キーなども秘匿できるし、何だったらサーバのIPでクライアントを固定してしまってもかまわない(苦笑

1人がナイス!しています

お返事ありがとうございます。 中継用phpと別サーバのphpで通信するのはいいかもしれないですね。その間は補足されなさそうです。 その前段に関しては、例えばjavascriptでセッションにスコア等情報を入れて、中継用phpを呼んだ際にセッションからスコア等情報を取り出して、別サーバーへ送信する、という流れだと理解してみました。これだと改ざんされなさそうですね! (もしおかしかったら指摘もらえればです) ありがとうございます。