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

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

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

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

Q&A

解決済

4回答

8259閲覧

PHP POSTデータの改変、改ざんを防ぐ方法について

gucha

総合スコア55

PHP

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

0グッド

0クリップ

投稿2018/10/21 23:40

POSTで送る値の改変を防ぎたいのですが良い方法が思いつかないので教えてください。
「POST 改変 対策」のような簡単な勉強は済ませてあります。
今回想定している値は単なる数値でセキュリティ面の話は省略させてもらいます。

何らかのアプリ、スクリプトで生成された「数値」で、
例えばゲームのお金やレベルといった簡素なものをDBに登録する時にPOSTを使うとした場合、
アプリやスクリプトで生成可能な範囲の値で、それが不正に改変されたものだと見分ける方法はあるのでしょうか?

色々考えて調べている内に「Signature」や「デジタル署名」というワードにたどり着きましたがどうにも解決できるイメージが湧きません・・・。
セッションとPOSTする値(レベルやお金)を組み合わせて暗号化し、サーバー側で復号化するといイメージなんですが、どうしてもPOSTする値が改変されてしまうように思えます。

今回のような場合は根本的に無理なのでしょうか?
それともSignatureやデジタル署名の仕組みを正しく理解できていないだけなのでしょうか?
また他に良い方法、考え方などありましたら教えてください。

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

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

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

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

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

maisumakun

2018/10/21 23:42

「不正に改変」は、どこで誰が行うことを想定していますか?
退会済みユーザー

退会済みユーザー

2018/10/22 01:10

不正を行うリスクをどこまで想定してどういう対策をしようとするのかを明瞭にするところから始まると思います。
guest

回答4

0

ベストアンサー

「簡素なもの」で登録させるから不正も簡単にできうるわけで、たとえば「ゲームのハイスコアと、それを生成するに至ったゲームのログ」などをセットで送信させるようにすれば、不正な操作は格段にやりづらくなります(ゲーム全体のログまででっち上げる必要が出てきます)。

そして、「ゲーム内通貨」のような、何が何でも整合させないといけないものは、サーバサイドで管理することが必要です。

投稿2018/10/21 23:59

maisumakun

総合スコア145183

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

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

maisumakun

2018/10/22 00:02

株式のオンライン取引のような場合、送信直前に「取引専用のパスワードを入力させる」などの対策をとっています(それでもMan in the Browserをやられれば限界はありますが)。
gucha

2018/10/22 09:16

一定のログも含めて「改変しにくくさせる」こと、重要なパラメータはサーバーで生成させるという考え方で進めることにしました。 「アレコレしてもダメ」という部分を端折った曖昧な質問になっていましたが丁寧に説明していただき、他の回答者の皆様も含めて感謝します。ありがとうございました。
guest

0

// 杞憂の故事を思い出させるくらいには不思議な質問かも。

デジタル署名は、双方の処理系外から持ち込まれるデータを
保証するための技術であり、単一の処理系内で用いられる
用途のものではないと理解しています。

今回のような場合にはクライアントの素性、たとえば
user agent などを確認するなどとなるでしょうが、
まあ偽装は簡単ですからねえ。

どうしても心配なら、新幹線や高速道路のように
専用の通路を用意するくらいかなあ。
ただし、コストが跳ね上がりますけどね。

セキュリティの話ではないといいつつ「改ざん」という
単語が出てくるので、実際のところ何を心配されて
いるのかが分かりづらいですなあ。
具体的にかくかくしかじかの場合はどうなの?
という追記があればもっと的確な回答があると思います。

投稿2018/10/22 00:46

takasima20

総合スコア7458

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

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

0

例えば対戦ゲームだとして、プレイヤーの能力、勝敗や金の引き出しなどは
クライアントからの要求を信じることはできません。
一つはプレイヤーの行動に対する要求のみを信用し、すべてのパラメータを
サーバーで管理することです。
しかしこれでは常に多くのデータをやりとりスル必要があり、
パフォーマンスが確保できません。
ユーザーを基本的に信じる場合は、行動のログをとっておき、
一定の頻度を超えるような異常データについてはチートとみなして警告
またはBANするというのが現実的でしょう

またもっと実用的なアプリについては、重要データにをapiに任せ
たとえば金銭の出納については自前で管理しないという考えもよいでしょう
(そういったapiが用意されている前提ですが)

投稿2018/10/22 00:30

yambejp

総合スコア114784

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

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

gucha

2018/10/22 08:55

正確な行動、正確な処理を経て得たパラメータだということ証明する場合はやはり「その行動」を送らせる必要があるのですね。今回はコスト的に採用はできませんがこの考え方が足りていなかったので先に進めそうです。ありがとうございます。
guest

0

それが不正に改変されたものだと見分ける方法はあるのでしょうか?

自動で見分ける方法はありません。
プログラム側は何がどのように送られてくるかは知りません。
単に送信された情報を受け取るだけです。
ただ、受け取った情報を正しいかどうかは、そのプログラムを作った側が検証することは出来ます。
いわゆる「バリデーション」というものです。
DBを用意されているということは、「ここには数値が入る」「ここには最大50文字入る」「ここには日付が入る」というのはプログラムを作った側が設定したルールですね。
そのルールに合っているか合っていないかの検証は、そのようなチェックプログラムを作れば良いです。
「合っているものの改変されたもの」かどうかはプログラムを作った側であっても検証は不可能ですが、
「この情報だけを受け入れる」ホワイトリスト か 「この情報は受け入れない」ブラックリスト
のどちらかの方式でのチェックを追加することで、「システム的には不正な情報」を弾くことは可能です。

投稿2018/10/21 23:49

m.ts10806

総合スコア80850

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問