ホームページ > バックエンド開発 > PHPチュートリアル > PHP でオブジェクトをアンシリアライズすることが悪い考えであるのはなぜですか?

PHP でオブジェクトをアンシリアライズすることが悪い考えであるのはなぜですか?

WBOY
リリース: 2024-07-20 05:06:29
オリジナル
762 人が閲覧しました

Why is unserializing an object in PHP a bad idea?

PHP でのシリアル化は、PHP オブジェクトを文字列に変換する方法です。この文字列は、データベースに保存したり、別の関数に渡したりするなど、さまざまな方法で使用できます。 PHP ドキュメントによると、これは、型や構造を失わずに PHP 値を渡すときに便利です。しかし、私はこれまでそのような問題に直面したことがありません。もしかしたら見えていないかもしれません。

<?php
$test = new User();
$test->name = "Denzyl";
echo serialize($test);
/// Output: O:4:"User":1:{s:4:"name";s:6:"Denzyl";}
ログイン後にコピー

それでは、文字列をダイジェストしてみましょう。 o は Object を表し、次の数字はオブジェクト名の長さです。 2 つの文字 s は、文字列と文字列の名前の長さを表します。

文字列を PHP に変換し直す必要がある場合は、unserialize 関数を呼び出し、文字列をパラメータとして渡します。

オブジェクトをシリアル化するときに、2 つのメソッドが自動的に呼び出されます。 __serialize() と __sleep()。これにより、クラス作成者はオブジェクトを文字列に変換する前に何かを行うことができます。
それはまさに要点です。ただし、ここでは文字列のシリアル化を解除することに焦点を当てましょう。これは、文字列を、後で PHP コードの実行時に使用できる実際の PHP オブジェクトに変換することを意味します。

<?php

$string = 'O:8:"User":1:{s:4:"name";s:6:"Denzyl";}';
echo unserialize($string)->name;
/// Output: Denzyl
ログイン後にコピー

同じ機能がシリアル化解除にも適用されます。ただし、今回は 2 つのメソッドは __unserialize() と __wakeup() です。

しかし、なぜそれが悪い考えなのでしょうか?

知らずに unserialize を使用すると、リモートでコードが実行される可能性があります。だからこそ、彼らは入力を決して信用してはいけないと言います。
あなたが怠け者で、ランダムな入力を信頼し、シリアル化されたオブジェクトに連結して、
ができるとします。 オブジェクト内の値を変更します。ドーン、ハッキングされる可能性があります。

<?php
$username = $_GET['username'];
$serialized = 'O:8:"User":1:{s:4:"name";s:6:"' . $username . '";}';
ログイン後にコピー

このようなものに対するエクスプロイトの書き方については説明しません。一部のツールではペイロードを自動的に生成できるため、自分自身をスクリプトキディと呼ぶことができます (私たちは皆、どこかから始まります)。私が知っているのは PHPGGC です。

エクスプロイトを理解するには、OWASP の記事を参照してください。
これまで知らなかった場合は、脆弱性に関する残りの OWASP 記事もお読みください

エクスプロイトの書き方をまだ説明していないことはわかっています。インターネット上の記事よりも優れた仕事はできないと思います。しかし、これであなたはこれを知ったので、自分で調べることができます。

悪用を防ぐにはどうすればよいでしょうか?

なぜこれを使用したいのですか?分かりません。私はシリアライズ/アンシリアライズを使用して問題を解決する機会があるほどプログラミングを長くしていない(約15年)。
私の解決策は抜本的すぎます。答えは簡単です。私の PHP プロジェクトでは使用しないでください

この記事は、大規模なプロジェクトを数分/数秒でスキャンできる PHP 用の静的分析ツールを作成するという私の旅の一連の記事の一部です。そしてルールを探してください

開発者がプロ​​ジェクトに含めたいと考えているもの。この記事を書いている時点では、
を停止するルールを作成中です。 人々が unserialize を使用しないようにすることで、次のリリースの準備が整うはずです。プロジェクトをフォローすると通知が届きます
さらにルールを書くことにしました。

以上がPHP でオブジェクトをアンシリアライズすることが悪い考えであるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート