Проверить данные в объекте PHP на соответствие

Пишу приложение авторизации на PHP API (Phalcon). Столкнулся с следующей задачей, при регистрации пользователя на сервере принимаются следующий запрос от клиента:

{
  "first_name": "Человек",
  "last_name": "Человечище",
  "email": "[email protected]",
  "password": "12345678"
} 

На стороне сервера запрос принимается $data = $this->request->getJsonRawBody(); и создается массив объектов: stdClass Object

(
    [first_name] => Человек
    [last_name] => Человечище
    [email] => [email protected]
    [password] => 12345678
)

Все бы не чего но вот задача, надо чтобы приходящие ключи соответствовали тому что я пропишу и нельзя было нечего левого добавить в запрос.

Если я посылаю запрос, или не добавляю какого-то ключа:

{
    "first_name": "Человек",
    "last_name": "Человечище",
    "email": "[email protected]",
    "password": "12345678",
    "ЛИШНИЙ КЛЮЧ": "ЛИШНЕЕ ЗНАЧЕНИЕ"
} 

То сервер не должен пропустить запрос. Как это можно реализовать?

Спасибо!


Ответы (2 шт):

Автор решения: Алексей Шиманский

Заранее создаём массив, где указываем все "подабающие" ключи. Так называемый "белый список".

['first_name', 'last_name, 'email', 'password']

затем из принятого массива берём ключи array_keys

Затем сравниваем два массива через array_diff. Если есть разница - значит что-то не то.

→ Ссылка
Автор решения: Eugene X

Очень много людей плюются и гадят сторону PHP, но всё-же решений из коробки там более чем достаточно. Ответ на твою задачу лежит в intersect функциях

<?php

$values = [
    "first_name" => "Человек",
    "last_name" => "Человечище",
    "email" =>  "[email protected]",
    "password" => "12345678",
    "ЛИШНИЙ КЛЮЧ" => "ЛИШНЕЕ ЗНАЧЕНИЕ"
];

$validator = [
    "first_name" => 1,
    "last_name" => 1,
    "password" => 1,
    "email" => 1,
];


$res = array_intersect_key($values, $validator);
print_r($res);

Результат выполнения, выявленные ключи из 2го массива, разрешены к значениям первого. Какие значения у 2го массива, без разницы.

Array
(
    [first_name] => Человек
    [last_name] => Человечище
    [email] => [email protected]
    [password] => 12345678
)
→ Ссылка