Подтвердить что ты не робот

Безопасно ли вызывать json_decode при вводе пользователя?

Я храню 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, и я не хотел бы, чтобы меня обвиняли в том, что наша база данных сервера упала. Любая помощь/информация оценена. =]

4b9b3361

Ответ 1

Использование json_decode для декодирования пользовательского ввода напрямую не имеет проблемы с безопасностью.

Это просто синтаксический анализ строки, не будет выполнять никаких строк.

json_decode в php подобен JSON.parse в javascript, и оба они могут использоваться непосредственно на входе пользователя, они безопасны во время декодирования.

Но после декодирования вы должны проверить данные для своих требований.

Ответ 2

Так же, как json_decode правильно реализовано, его следует безопасно использовать без дополнительной предварительной обработки (на самом деле это может быть хуже, если у вас могут быть ошибки в вашем предварительном процессоре).

Ответ 3

json_decode завершится с ошибкой, если данные не находятся в формате json, и в противном случае вы получите хороший массив для работы. Как сказал Итай, если кто-то может использовать это, он почти заслуживает того, чтобы войти. Json_decode не страдает от риска sql, поэтому я бы сказал, что вы в порядке делаете это.

Просто убедитесь, что вы очистили что-либо (или белый список, как и вы уже), прежде чем включать его в запрос.