最近、(文字列ではなく)「予期しない」配列を含む変数を送信すると、致命的なエラーやその他の望ましくない動作が発生する可能性があることを発見しました。例: ###
次の配列があります:リーリー
ユーザーは$_REQUEST["key"] を送信します。これはリスト内の要素を見つけるために使用されます:
リーリー
$_REQUEST["key"] の型が
string、
int、
float、
bool## の場合# または null
の場合、スクリプトは見つかったエントリを表示するか、何も表示しません (= null)。これは望ましい動作です。
が array
の場合、スクリプトは致命的なエラーで停止します。
または !is_array()
) を追加することです。しかし、次の代替案がセキュリティの観点から合理的であるかどうか疑問に思っています:
各リクエストの開始時に、次のスクリプトが実行されます:
これにより、サーバーへの配列の送信が事実上無効になります。コード配列内の位置が実際に必要な場合は、
json_decode() を使用して手動でデコードされます。
これは良いアイデアですか?
各入力変数を手動で検証する必要がないように、各入力変数を手動でデコードします。私にとって、これは同じ煩わしさですが、さらに混乱し、パフォーマンスも低下し、新たなバグもあります (たとえば、入力が有効な UTF-8 でない場合、
json_encode()
は壊れます)。一般に、アプリケーションの入力について明示的にすることは有益です。既知の変数のセットを既知の状態で使用するようにすると、時間とトラブルを大幅に節約できます。
リーリー\TypeError
だけが懸念される場合は、すべてを try/catch ブロックで囲むことができます。関数を使用してコードの重複を避けることができます:
リーリー検証フレームワークを構築することも、サードパーティのフレームワークを使用することもできます。
私は、特定の特殊なケースを防ぐために、すべての入力をいじる前に多くのことを行います。