Я храню JSON-кодированный массив целых индексов = > целочисленные значения в файле cookie.
Очевидно, что файлы cookie можно легко манипулировать, как и любой другой пользовательский ввод, поэтому здесь моя проверка на получение файлов cookie:
if ($_COOKIE['myCookie']) { //if cookie exists
$myCookie = json_decode($_COOKIE['myCookie'], true);
if (!is_array($myCookie)) { //in case decoding fails or bad cookie
$myCookie = array(); //sets it as empty array
}
} else { //if cookie doesn't exist, uses an empty array instead
$myCookie = array();
}
Затем, прежде чем использовать какое-либо из значений, я проверяю, существует ли он в массиве и проверяет список белых значений - эта часть кажется довольно безопасной, но я отправляю ее как часть проверки:
if (!empty($myCookie[$index])) { //checks if index exists and is truthy
if ($myCookie[$index] !== 1 && $myCookie[$index] !== 2) { //values whitelist
die('Hacking attempt through cookies exploit.');
}
//use the cookie data now
}
Вернемся к вопросу, безопасно ли вызывать json_decode
непосредственно в файле cookie? Могут ли пользователи манипулировать файлом cookie для запуска произвольного кода?
Я до сих пор читал много тем о SO, и я обнаружил, что unserialize()
тускнеет небезопасно, потому что он вызывает конструкторы, но json_decode
является технически безопасным. Я прочитал их страницы php.net, но они не касаются безопасности напрямую.
Мой аддон скоро дойдет до бета-версии, так что мне интересно, достаточно ли вызывать вызов json_decode
непосредственно в файле cookie, или если я должен запустить некоторый тип проверки перед вызовом json_decode
. Я мог бы запустить preg_match
тоже, но когда я тестирую белый список значений перед их использованием, не должно быть никаких проблем, если json_decode
каким-то образом не запускает произвольный код, а это не так, правильно?
Я знаю, что json_encode
возвращает NULL
, если он недействителен JSON, но мне интересно, если это правильный подход или следует добавить какую-то проверку перед вызовом json_decode
?
Извините, если это слишком глупо вопрос, у меня просто очень мало опыта работы с cookie/JSON, и я не хотел бы, чтобы меня обвиняли в том, что наша база данных сервера упала. Любая помощь/информация оценена. =]