Robi się trochę trudniejsze, kiedy zaczynam się ja nto zagnieżdżone sprawdzanie poprawności elementu tablicy, szczególnie jeśli dotyczy to symboli wieloznacznych. Umieść to w niestandardowej klasie Request
i wprowadź ją do swojej metody kontrolera. Powinien obejmować wszystkie przypadki.
public function authorize()
{
//Dot notation makes it possible to parse nested values without recursion
$original = array_dot($this->all());
$filtered = [];
$rules = collect($this->rules());
$keys = $rules->keys();
$rules->each(function ($rules, $key) use ($original, $keys, &$filtered) {
//Allow for array or pipe-delimited rule-sets
if (is_string($rules)) {
$rules = explode('|', $rules);
}
//In case a rule requires an element to be an array, look for nested rules
$nestedRules = $keys->filter(function ($otherKey) use ($key) {
return (strpos($otherKey, "$key.") === 0);
});
//If the input must be an array, default missing nested rules to a wildcard
if (in_array('array', $rules) && $nestedRules->isEmpty()) {
$key .= ".*";
}
foreach ($original as $dotIndex => $element) {
//fnmatch respects wildcard asterisks
if (fnmatch($key, $dotIndex)) {
//array_set respects dot-notation, building out a normal array
array_set($filtered, $dotIndex, $element);
}
}
});
//Replace all input values with the filtered set
$this->replace($filtered);
//If field changes were attempted, but non were permitted, send back a 403
return (empty($original) || !empty($this->all()));
}
Próbuję zrozumieć, co chcesz. Masz na myśli, kiedy formularz jest zaksięgowany z wieloma polami w formularzu, powiedzmy, jak 5 pól imię, nazwisko, kraj, płeć, wiek i chcesz wybrać tylko dwa pola ignorujące innych, powiedzmy tylko płeć, kraj? – Digitlimit
Powinna to być pierwsza linia obrony dla wprowadzania dodatkowych pól w formularzu przez agressor. Kiedy mam formularz z tymi 5 polami, to chcę tylko te pola w żądaniu po stronie serwera, jeśli ktoś doda jakiekolwiek inne pole o wartości, to chcę odrzucić to żądanie lub usunąć te dodatkowe pola z żądania. – Son