フロントエンド分離伝送では、フロントエンドは通常、データをJSON形式のバックエンドに送信します。データの整合性とセキュリティを確保するために、バックエンドは、これらのフィールドが予想されるフィールドと一致することを確認する必要があります。 PHPのarray_diff_ukey()関数は、これを優雅に達成するのに役立ちます。
この記事では、簡単な例を使用して、 array_diff_ukey()を使用して、バックエンドで許可されているフロントエンドとフィールドが送信したフィールドを比較して、不一致のキー名を見つけます。
array_diff_ukey()は、2つの配列のキー名を比較し、比較にユーザー定義のコールバック関数を使用するPHPビルトイン関数です。最初の配列に表示されるが、2番目の配列には表示されないキー名に対応する値を返します。
関数プロトタイプ:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
バックエンドに次のフィールドのみを受信したいとします。
$allowedFields = [
'username' => true,
'email' => true,
'age' => true,
];
フロントエンドは次のデータを提出しました。
$submittedData = [
'username' => 'alice',
'email' => 'alice@example.com',
'age' => 25,
'is_admin' => true, // 違法フィールド
];
「is_admin」が違法な分野であることを検出する必要があります。
<?php
$allowedFields = [
'username' => true,
'email' => true,
'age' => true,
];
$submittedData = [
'username' => 'alice',
'email' => 'alice@example.com',
'age' => 25,
'is_admin' => true,
];
// 使用 array_diff_ukey フィールド比較を実施します
$invalidFields = array_diff_ukey(
$submittedData,
$allowedFields,
function($key1, $key2) {
return strcmp($key1, $key2);
}
);
if (!empty($invalidFields)) {
echo "检测到違法フィールド:\n";
foreach ($invalidFields as $field => $value) {
echo "- $field: $value\n";
}
// ログを記録するか、エラーメッセージを返すことができます
// サンプルログインターフェイスコール(擬似コード):
$logUrl = 'https://api.m66.net/logs/invalid-fields';
// sendToApi($logUrl, ['fields' => array_keys($invalidFields)]);
} else {
echo "フィールド検証が合格しました。\n";
}
フロントエンドのフィールド名がバックエンド(キャメル対アンダースコアなど)と矛盾している場合、フィールドマッピングテーブルと組み合わせて使用できます。
$fieldMap = [
'userName' => 'username',
'emailAddress' => 'email',
'userAge' => 'age',
];
// 検証のためにマップテーブルを逆にします
$mappedKeys = array_flip($fieldMap);
// シミュレーションの提出
$submittedData = [
'userName' => 'alice',
'emailAddress' => 'alice@example.com',
'userAge' => 25,
'adminStatus' => true,
];
$invalidFields = array_diff_ukey(
$submittedData,
$mappedKeys,
'strcmp'
);
if (!empty($invalidFields)) {
echo "次のフィールドはマッピングテーブルで定義されていません:\n";
print_r(array_keys($invalidFields));
} else {
echo "フィールドマッピング検証が合格しました。\n";
}
array_diff_ukey()を使用すると、フロントエンド、またはマッピングテーブルで定義されていないフィールドに渡された違法フィールドをすばやく見つけることができます。これにより、違法なデータインジェクションを防ぐだけでなく、フィールド検証ロジックも簡素化されます。プロジェクトの保守性とセキュリティを改善するための一般的なフォーム検証ツール方法としてカプセル化することをお勧めします。