検索

ホームページ  >  に質問  >  本文

PHP: ユーザー入力内の (予期しない) 配列の処理

最近、(文字列ではなく)「予期しない」配列を含む変数を送信すると、致命的なエラーやその他の望ましくない動作が発生する可能性があることを発見しました。例: ###

次の配列があります:

リーリー

ユーザーは

$_REQUEST["key"] を送信します。これはリスト内の要素を見つけるために使用されます: リーリー

$_REQUEST["key"] の型が stringintfloatbool## の場合# または null の場合、スクリプトは見つかったエントリを表示するか、何も表示しません (= null)。これは望ましい動作です。

$_REQUEST["key"]

array の場合、スクリプトは致命的なエラーで停止します。

ここで、明らかな解決策は、コード全体に何千もの型チェック (
is_scalar()

または !is_array()) を追加することです。しかし、次の代替案がセキュリティの観点から合理的であるかどうか疑問に思っています: 各リクエストの開始時に、次のスクリプトが実行されます:

リーリー

これにより、サーバーへの配列の送信が事実上無効になります。コード配列内の位置が実際に必要な場合は、

json_decode()

を使用して手動でデコードされます。 これは良いアイデアですか?

P粉547362845P粉547362845226日前534

全員に返信(1)返信します

  • P粉668113768

    P粉6681137682024-04-02 14:31:09

    各入力変数を手動で検証する必要がないように、各入力変数を手動でデコードします。私にとって、これは同じ煩わしさですが、さらに混乱し、パフォーマンスも低下し、新たなバグもあります (たとえば、入力が有効な UTF-8 でない場合、json_encode() は壊れます)。

    一般に、アプリケーションの入力について明示的にすることは有益です。既知の変数のセットを既知の状態で使用するようにすると、時間とトラブルを大幅に節約できます。

    リーリー

    \TypeError だけが懸念される場合は、すべてを try/catch ブロックで囲むことができます。

    関数を使用してコードの重複を避けることができます:

    リーリー

    検証フレームワークを構築することも、サードパーティのフレームワークを使用することもできます。

    私は、特定の特殊なケースを防ぐために、すべての入力をいじる前に多くのことを行います。

    返事
    0
  • キャンセル返事