目次
1.ビジネスロジックで直接スーパーグロバルを使用しないでください
2。より良い制御とテスト可能性のために、スーパーグロバルをラップします
3.早期に消毒して検証します
4. $ _Sessionへの依存を最小限に抑えます
5.ライブラリやヘルパーのスーパーグロバルを避けてください
6. $ _Serverに注意してください
最終的な考え
ホームページ バックエンド開発 PHPチュートリアル グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

Aug 08, 2025 pm 06:28 PM
PHP Global Variables - Superglobals

入力を早期に抽出および消毒することにより、ビジネスロジックでスーパーグロバルを直接使用しないようにし、それを明示的に機能に渡すことを避けます。 2。スーパーグローバルアクセスをカプセル化するためのリクエストやセッションなどのラッパークラスを作成し、テスト可能性と制御を改善します。 3.アプリケーションのエントリポイントでfilter_input()または検証ライブラリを使用して、常に入力を消毒および検証します。 4.専用のクラスを通じてセッション管理を集中化し、session_start()を呼び出すことにより、$ _Sessionへの依存を最小限に抑えます。 5.再利用可能なライブラリまたはヘルパーにスーパーグロバルにアクセスしないでください。コンテキストの独立性を維持するためのパラメーターとして必要なデータを渡す。 6. $ _Serverを慎重に処理し、重要な存在を確認し、特にCLIまたは信頼できない環境での価値に関する仮定を回避します。 SuperGlobalsを信頼できない入力ソースとして扱い、安全なインターフェイスの背後にそれらを抽象化することにより、PHPアプリケーションのセキュリティ、保守性、テスト可能性を改善します。

グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

PHPスーパーグロバル - $_GET$_POST$_SESSION$_SERVERなどの組み込み変数 - は便利ですが、しばしば悪用されます。それらはグローバルにアクセス可能であるため、隠された依存関係を導入し、テストを難しくし、慎重に処理しないとセキュリティリスクを作成できます。それらを調整することは、それらを完全に避けることではなく、それらを思慮深く使用し、より安全で予測可能なパターンで包みます。

グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

PHPスーパーグロバルをアプリケーションを引き継ぐことなく効果的に使用する方法は次のとおりです。


1.ビジネスロジックで直接スーパーグロバルを使用しないでください

最大の落とし穴の1つは、関数またはクラスの奥深くに$_POST['email']または$_GET['id']を参照することです。これにより、コードをHTTPリクエストにしっかりと結合し、テストまたは再利用が難しくなります。

グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

代わりに、入力を早期に抽出して消毒し、明示的に渡します。

 // bad:ロジックでの直接使用
関数saveuser(){
    $ email = $ _post ['email'];
    // ... プロセス
}

// good:データを注入します
function saveuser(string $ email){
    // ... プロセス
}

//トップレベルで(コントローラーまたはルートハンドラー)
$ email = filter_input(input_post、 'email'、filter_validate_email);
if($ email){
    SaveUser($ email);
}

これにより、ビジネスロジックが清潔でテスト可能になります。これで、 saveUser('test@example.com')スーパーグロバルを偽造せずにユニットテストで呼び出すことができます。

グローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略

2。より良い制御とテスト可能性のために、スーパーグロバルをラップします

薄いラッパークラスまたはユーティリティ関数を作成して、スーパーグローバルデータにアクセスします。これにより、単一の制御ポイントが得られ、テスト中にock笑を簡単にします。

Get and Postのラッパーの例:

クラスリクエスト
{
    public function get(string $ key、$ default = null):mixed
    {
        $ _get [$ key]を返しますか?? $ default;
    }

    パブリック関数post(string $ key、$ default = null):mixed
    {
        $ _POST [$ key]を返しますか?? $ default;
    }

    public function haspost(string $ key):bool
    {
        ISSETを返す($ _ post [$ key]);
    }
}

これで、コードは$_POST['email']の代わりに$request->post('email')を使用します。テスト中、グローバルな状態に依存する代わりに、モックまたはテストダブルを渡すことができます。


3.早期に消毒して検証します

スーパーグロバルには、生の信頼できない入力が含まれています。データが安全であると仮定しないでください。

phpのfilter_input()またはfilter_var()関数を使用して、検証し、サニタイズします。

 $ email = filter_input(input_post、 'email'、filter_validate_email);
$ age = filter_input(input_post、 'age'、filter_validate_int、[
    'options' => ['min_range' => 18、 'max_range' => 120]
]);
$ url = filter_input(input_post、 'url'、filter_sanitize_url);

または、より複雑なルールについては、検証ライブラリ(尊敬\検証やSymfony検証装置など)を使用します。重要なのは、コード全体に散らばるのではなく、エントリポイントで検証することです。


4. $ _Sessionへの依存を最小限に抑えます

$_SESSIONコードを静かに結合して、制御しないと述べることができるもう1つのグローバルです。 $_SESSIONに直接書き込む代わりに:

 //❌
$ _Session ['user_id'] = 123;

セッションロジックをカプセル化します:

クラスセッション
{
    パブリック関数セット(String $ key、$ value):void
    {
        $ _Session [$ key] = $ value;
    }

    public function get(string $ key、$ default = null):mixed
    {
        $ _SESSION [$ key]を返しますか?? $ default;
    }

    public function setuser(int $ id):void
    {
        $ this-> set( 'user_id'、$ id);
    }

    パブリック関数getUserid():?int
    {
        return $ this-> get( 'user_id');
    }
}

現在、セッション管理は集中化され、デバッグが簡単で、ock笑が可能になりました。

また、常にリクエストの開始時にsession_start()を1回呼び出し、ファイル全体に散在することを避けてください。


5.ライブラリやヘルパーのスーパーグロバルを避けてください

再利用可能なコンポーネント(メーラー、ロガー、ユーティリティなど)は、 $_SERVER$_GET 、または$_POSTに直接アクセスしないでください。これにより、Webコンテキストに依存します。

代わりに、必要なデータ(例えば、現在のURL、ユーザーエージェント)をパラメーターとして渡す:

 //❌
関数logRequest(){
    error_log($ _ server ['request_uri']);
}

//✅
function logrequest(string $ uri){
    error_log($ uri);
}

// 使用法
logRequest($ _ server ['request_uri']);

これにより、CLIまたはAPIのコンテキストでヘルパーが柔軟になり、使用可能になります。


6. $ _Serverに注意してください

$_SERVERには有用な情報( REQUEST_METHODHTTP_USER_AGENTREMOTE_ADDRなど)が含まれていますが、すべてのキーが存在することが保証されているわけではありません。常に確認してください:

 $ method = $ _server ['request_method'] ?? '得る';
$ ip = $ _server ['remote_addr'] ?? '未知';

覚えておいてください: $_SERVER CLIモードでスプーフィングまたは欠落している可能性があります。重要なロジック(レート制限など)については、信頼できるプロキシまたはミドルウェアを使用して信頼できる値を設定することを検討してください。


最終的な考え

スーパーグロバルは悪ではなく、ツールです。問題は、それらが不注意に使用され、緊密な結合と予測不可能な動作を作成するときに発生します。

  • 入力を早期に抽出して消毒します
  • 抽象化でスーパーグロバルをラップします
  • 使用する前に検証します
  • ビジネスロジックをグローバルな依存関係から解放してください
  • テスト可能性と再利用のための設計

スーパーグロバルをドメインモデルの一部としてではなく、生の入力ソースとして扱うことにより、コードをよりメンテナンスしやすく、安全で、テストしやすくします。

基本的に、 $_GET$_POST 、および友人のような友人を扱います。

以上がグローバル状態の飼い慣らし:PHPスーパーグロバルを効果的に使用するための戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

ナビゲーションデータ送信:$ _get、$ _Post、および$ _Requestの比較分析 ナビゲーションデータ送信:$ _get、$ _Post、および$ _Requestの比較分析 Aug 03, 2025 am 07:13 AM

$ _GETRETRIEVESDATAFROMURLPARAMETERS、ISVISIBLEANDBOOKMARKABLE、適切なフォルノン感受性、iDempotentoperationsieSearchorfiltering.2

スーパーグローバル入力を消毒することにより、共通の脆弱性を緩和します スーパーグローバル入力を消毒することにより、共通の脆弱性を緩和します Aug 03, 2025 am 10:33 AM

AlwityValidateandSanitizeSuperglobalinputsusingfunctionslikefilter_input()orfilter_var()onfilter_var()toensureateTsexcreatiaandsisfreeofmaliciouscontent.2.useprepStatementementementementementementementementementementementementementementementementementementized databaseoperation -operation -operation -operation -operteration -opreventsepreventreventreventrevented ev

ファイルをマスターするための決定的なガイドは、$ _filesスーパーグローバルを使用してアップロードします ファイルをマスターするための決定的なガイドは、$ _filesスーパーグローバルを使用してアップロードします Aug 05, 2025 pm 01:36 PM

ファイルアップロードのコアは、エラーを確認し、ファイルの種類を確認し、ファイルを変更して安全に移動することです。 1.最初に$ _files ['error']がupload_err_okであるかどうかを確認します。 2. FINFOを使用して、クライアントデータを信頼する代わりに実際のMIMEタイプを検出します。 3.ファイル拡張子を確認し、許可されたタイプを制限します。 4.パストラバーサルを防ぐために、bin2hex(random_bytes(16))などのランダム名を持つファイルを変更します。 5. MOVE_UPLOADED_FILE(); 6.ストレージの場所は、可能な限りWebルートディレクトリの外側に配置する必要があり、開示する必要がある場合は、スクリプトの実行が無効になります。 7。GDまたは

$ globalsアレイvs.「グローバル」キーワード:パフォーマンスとスコープ分析 $ globalsアレイvs.「グローバル」キーワード:パフォーマンスとスコープ分析 Aug 05, 2025 pm 06:24 PM

globalkeywordisslyfasterthan $ globalsduetodirectsymboltablebinding、buttheperformancedifferenceisnegligible in mostapplications.2。$ globalsprovidesdirectacestotheglobalbalsyblaltabletable andallowsunsettinggloblariabliablersunctionsは

Webリクエストの解剖学:SuperGlobalsがHTTPプロトコルにどのようにマップするか Webリクエストの解剖学:SuperGlobalsがHTTPプロトコルにどのようにマップするか Aug 04, 2025 pm 12:40 PM

$ _get、$ _post、$ _serverなどのPHPハイパーグローバル変数は、HTTP要求の各部分を直接マッピングします。 2。$ _POSTプロセスは、ユーザー名やパスワードなど、POST要求本体にデータを形成します。データはURLに含まれておらず、大量の送信できますが、セキュリティを確保するためにHTTPSが必要です。 3。$ _Serverには、request_methodがHTTPメソッド、http_hなどのリクエストメタデータが含まれています。

テスト能力のためのアーキテクテクティブ:最新のPHPアプリケーションでのスーパーグロバルの分離 テスト能力のためのアーキテクテクティブ:最新のPHPアプリケーションでのスーパーグロバルの分離 Aug 04, 2025 am 06:28 AM

$ _get、$ _post、$ _Sessionなどのハイパーグローバル変数がグローバルな状態に属し、コード結合環境、シミュレートされた入力の困難、テスト間の状態の漏出を引き起こすため、PHPアプリケーションのテスト可能性を改善するには、ハイパーグローバル変数の直接使用を分離する必要があります。 1. PSR-7やSymfonyHTTPFoundationなどの標準要求オブジェクトを使用して、入り口の入力データをカプセル化して、ハイパーグローバル変数に直接アクセスするビジネスロジックを回避します。 2。セッションとCookie操作および依存関係インジェクションのインターフェイス(SessionInterfaceなど)を定義して、テスト中のシミュレートされた実装との交換を容易にします。 3.専用クラスの$ _Serverなどの環境データをカプセル化し、オブジェクトメソッドを介してアクセスして、

複雑な形式およびAPI処理のための高度なスーパーグローバルテクニック 複雑な形式およびAPI処理のための高度なスーパーグローバルテクニック Aug 04, 2025 pm 02:44 PM

rapsuperglobalsinarequestobjecttoimprovetavesability andmaintainability;

「Register_Globals」から機能をフィルタリングする:スーパーグローバルセキュリティの進化 「Register_Globals」から機能をフィルタリングする:スーパーグローバルセキュリティの進化 Aug 05, 2025 am 04:40 AM

thedeprecation of of register_globalsandtheadoption fulterfunctions markedapivotalsphp’ssecurityevolution; 1.register_globalswaswasremoveddueToitsvulnerabilityは、攻撃を許可します

See all articles