2011-01-29 5 views
2

私は$ _GET []を介して私のWebページの周りにurlencode()d serialize()d配列を渡しています。

$ _GETの値を逆シリアル化()することは安全ですか?デシリアライズされた配列がユーザに表示されることがあります。ユーザーがコード内で変数や関数などを公開/参照することは可能でしょうか?言い換えれば、値をデシリアライズするとき、PHPはデータまたはコードとして扱いますか?

更新:

私はドキュメントは言う参照してください。 「。あなたがシリアライズされている配列/オブジェクト内の循環参照は、他の任意の参照は失われます保存されます」

は、だから、私は」を意味します安全ですか? :-)

+0

これは以前に何らかの形で尋ねられてきましたが、詐欺を見つけることができません。 –

答えて

6

絶対に、積極的に、

クライアント側から何かを盲目的に信頼してはいけませんが、より自信を持てる方法があります。

私は、クライアント側からPHPシリアル化データが得られたとしたら、そのクライアントはある時点でサーバーから取得したと仮定していますか?その場合、クライアントがデータを変更しない場合は、データと一緒にハッシュを含めて、改ざんされていないことを確認することができます。

もう1つの方法は、オブジェクトのシリアル化を解除することですが、汚染されているとみなし、シリアル化されていないデータをコピーして「クリーン」オブジェクトに再確認します。

+1

オブジェクトのシリアル化を解除することは、ある種の比較的難解な状況下ではセキュリティ上の問題になる可能性があります。回避できない場合、私はそれをしません。私の答えを参照してください - これについての質問がどこかにありますが、私はそれを見つけることができません... –

+0

すべての回答は参考になりましたが、これには実用的な提案がありました。しかし、私の配列の内容は単純な平文であるため、連結した文字列として渡して後で分割します。 – sil

+0

@Pekka、私は同意します。しかし、私はあまりにもクライアント側から何かを盲目的に非直列化するために緊張しているだろう。私もあなたの答えが好きだったので、+1を持ってください:) –

6

このメソッドは、他の種類の着信GETまたはPOSTデータと同じように安全です。常にはデータを処理する前に消毒する必要があります。しかし、ユーザーデータのシリアル化を解除することには、さらに問題があります。

オブジェクトのシリアル化を解除すると、PHPはクラスに__wakeup magic methodがあるかどうかを調べます。このメソッドは、存在する場合に実行されます。

これは、クラス定義がシリアル化されたデータで決して送信されないため、これは大きなセキュリティホールではありません。どんな悪質なコードもすでにシステムに存在していなければなりません。しかし、これが問題(例えばサードパーティのコードをインストールできるプラグインシステム)であるシナリオが考えられ、私はこれに非常に注意しています。

また理論的には、攻撃者はこれを使用して、スクリプト内の任意のクラスのオブジェクトを作成できます。すぐにセキュリティ上の問題ではありませんが、それは確かに良い練習ではありません。

「ダム」データのみを含むことができるので、JSONエンコーディングはより安全な方法です。

+0

私はこの答えが好きです。また、データの概念とデータを扱うPHPオブジェクトを分離します。 *一般的に*、私はこのような分離が問題についてより重要なことを考えるようになることを発見しました。 –

0

オブジェクト/配列/変数のデータ部分をシリアル化すると、実際の実行可能コードはシリアル化されません。同じであっても異なっていてもかまいません - データに関しては重要ではありません。

ハッシュは可能ですが、データに基づいているだけで、クラスと型と値が異なる場合があります。デシリアライズ時にエラーに対処する方法はコードの上にあります。

-1

はい、安全です。 $ _GET配列の値をシリアル化するのが安全かどうかを確認しています。はい、安全です。配列のシリアライゼーション中に何も実行されません。$ _GET配列にはオブジェクトが含まれておらず、クエリ文字列のパラメータだけが含まれているため、シリアライゼーション/シリアル化解除時には問題ありません。

あなたは、循環参照に関するドキュメントで見たことを述べました。それを心配しないでください。$ _GET配列の中にオブジェクトがないので、あなたのケースには当てはまりません。

限りの$ _GET配列から実際のデータを使用するなど、それは別の問題だと答えはノー、それは

最初のフィルタまたは検証のいくつかのタイプを適用せずに$ _GET配列からのデータを使用しても安全ではありませんでしょう
+0

しかし、それは彼が求めているものではありません。彼は*変数をシリアル化してGET経由で送信するのが安全かどうかを尋ねています。 –

+0

この回答は100%間違っています。 unserialize()をユーザーが指定したデータで使用することは安全ではありません。 php.netのマニュアルはこれに対して警告します。 http://php.net/unserialize –

関連する問題