Statement on glibc/iconv Vulnerability

json_validate

(PHP 8 >= 8.3.0)

json_validateПроверяет, содержит ли строка допустимые данные в JSON-формате

Описание

json_validate(string $json, int $depth = 512, int $flags = 0): bool

Функция проверяет, соответствует ли синтаксис входной строки (string) формату JSON, и возвращает результат. Если функция json_validate() вернёт true, функция json_decode() успешно декодирует входную строку при передаче тех же аргументов depth и flags.

Функции json_last_error() и json_last_error_msg() укажут причину, если функция json_validate() вернёт false.

Функция json_validate() использует меньше памяти, чем функция json_decode(), поскольку функции json_validate() не нужно декодировать полезную нагрузку JSON или создавать структуру массива или объекта, которая содержит полезную нагрузку.

Предостережение

Вызов функции json_validate() непосредственно перед функцией json_decode() приведёт к ненужному двойному разбору строки, поскольку функция json_decode() неявно выполняет такую проверку при декодировании.

Функцию json_validate() вызывают только в случае, когда данные декодирования полезной нагрузки JSON не нужны немедленно, и требуется знать, содержит ли строка допустимый JSON.

Список параметров

json

Строка для проверки.

Функция работает только со строками в кодировке UTF-8.

Замечание:

PHP реализует расширенный набор JSON, который описывает исходный стандарт » RFC 7159.

depth

Максимальная глубина вложенности структуры, которую будет декодировать функция. Значение должно быть больше 0 и меньше или равно 2 147 483 647.

flags

Пока принимается только константа JSON_INVALID_UTF8_IGNORE.

Возвращаемые значения

Функция возвращает true, если входная строка — синтаксически допустимый JSON, иначе false.

Ошибки

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

Если значение параметра flags — недопустимый флаг, выбрасывается исключение ValueError.

Примеры

Пример #1 Пример использования функции json_validate()

<?php

var_dump
(json_validate('{ "test": { "foo": "bar" } }'));
var_dump(json_validate('{ "": "": "" } }'));

?>

Результат выполнения приведённого примера:

bool(true)
bool(false)

Смотрите также

  • json_decode() - Декодирует строку JSON
  • json_last_error() - Возвращает последнюю ошибку
  • json_last_error_msg() - Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()

add a note

User Contributed Notes 3 notes

up
12
Behrad
3 months ago
---------------- PHP < 8.3 ----------------

function json_validate(string $string): bool {
json_decode($string);

return json_last_error() === JSON_ERROR_NONE;
}

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

---------------- PHP >= 8.3 ----------------

var_dump(json_validate('{ "test": { "foo": "bar" } }')); // true

Note: code from https://www.php.net/releases/8.3/en.php
up
4
Julien T.
2 months ago
Building upon Allan R.'s initial idea, I've developed an improved version of the json_validate function for those using PHP 8.2 and earlier versions. This function emulates the functionality introduced in PHP 8.3, providing an effective way to validate JSON strings in earlier PHP versions.

```php
if (!function_exists('json_validate')) {
/**
* Validates a JSON string.
*
* @param string $json The JSON string to validate.
* @param int $depth Maximum depth. Must be greater than zero.
* @param int $flags Bitmask of JSON decode options.
* @return bool Returns true if the string is a valid JSON, otherwise false.
*/
function json_validate($json, $depth = 512, $flags = 0) {
if (!is_string($json)) {
return false;
}

try {
json_decode($json, false, $depth, $flags | JSON_THROW_ON_ERROR);
return true;
} catch (\JsonException $e) {
return false;
}
}
}
```

Key Improvements:

- String Check: Added a validation to ensure the input is a string.
- Error Handling: Utilizes try-catch to effectively catch and handle JsonException.
- Backward Compatibility: Safely integrable in older PHP versions, automatically deferring to native functionality in PHP 8.3+.
up
1
Allan R.
2 months ago
Pre PHP 8.3, and future compatible, function/wrapper

---
if(!function_exists("json_validate")) {
function json_validate() {
try {
json_decode($json, JSON_THROW_ON_ERROR);
return true;
} catch(\JsonException) {
return false;
}
}
}
---

An issue with simply relying on json_last_error() == JSON_ERROR_NONE is if you have an error handler that catches errors or notices and throws them instead as fx. \ErrorException

That would cause a call to json_decode(); to throw an exception exiting the scope of the function.
To Top