JSON to XML - v1.3.0 / v1.3.1
Versione Italiana
v.1.3.1
Versione di correzione dei bug per lo strumento da riga di comando.
Correzioni
bin/json-to-xmlora funziona quando il pacchetto è installato come dipendenza. A partire dalla versione 1.1.0, lo script cercava il filevendor/autoload.phpin relazione alla propria posizione, che esiste solo in un checkout del repository. In un progetto in cui il pacchetto era installato,vendor/bin/json-to-xmlgenerava un errore con il messaggioFailed opening required ‘.../vendor/autoload.php’. Ora lo script cerca l'autoloader di Composer in diverse posizioni e un test di regressione simula la struttura del progetto installato.
Le classi della libreria (JsonToXmlConverter, XmlToJsonConverter) non sono interessate dal problema: solo la CLI presentava un malfunzionamento.
Se avete installato una versione compresa tra la 1.1.0 e la 1.3.0 e utilizzate la CLI dalla cartella vendor/bin del vostro progetto, effettuate l'aggiornamento alla versione 1.3.1.
Log completo delle modifiche: CHANGELOG
v.1.3.0
Questa versione rafforza la sicurezza di XmlToJsonConverter contro gli attacchi denial of service basati su entità e risolve due problemi relativi alla correttezza dei dati in JsonToXmlConverter. Si prega di leggere la sezione “Behavior changes” prima di effettuare l'aggiornamento: alcuni input che in precedenza venivano accettati ora vengono rifiutati.
Behavior changes
XmlToJsonConverterora rifiuta i riferimenti alle entità dichiarate nel DOCTYPE, sia nei valori degli attributi che nel contenuto degli elementi, generando un’eccezioneInvalidArgumentException(codice di uscita3dalla CLI). Le entità predefinite (&,<,>,",') e i riferimenti ai caratteri (A) non sono interessati da questa modifica.- Nei valori degli attributi, la lettura del valore espandeva l’entità con un costo quadratico, che né
loadXML()né i limiti propri di libxml2 riuscivano a impedire. Con libxml2 2.10.4, 16 MB di contenuto espanso richiedevano circa 14 s, mentre un documento appositamente creato di circa 250 KB non veniva completato entro il timeout di 15 s previsto dal test. - Nel contenuto degli elementi, tali riferimenti venivano in precedenza ignorati silenziosamente, con conseguente perdita di dati.
- Se si fa affidamento su entità personalizzate, è consigliabile inserirle inline prima di passare l’XML alla libreria.
- Nei valori degli attributi, la lettura del valore espandeva l’entità con un costo quadratico, che né
- I numeri interi JSON che superano l'intervallo int64 vengono ora scritti per esteso. Vengono decodificati come stringhe (
JSON_BIGINT_AS_STRING) anziché essere arrotondati a un numero in virgola mobile, quindi12345678901234567890non viene più emesso come1.2345678901235E+19. - I caratteri non consentiti in XML 1.0 vengono ora rifiutati.
JsonToXmlConvertergenera un'eccezioneInvalidArgumentExceptionper i valori contenenti caratteri di controllo diversi da tabulazione, avanzamento riga e ritorno a capo, invece di produrre silenziosamente un documento non valido.
Nuovo
- Test di regressione per attacchi di espansione delle entità (Billion Laughs, entità ricorsive, crescita quadratica del contenuto degli elementi e dei valori degli attributi). I payload pesanti vengono eseguiti in un processo PHP separato con un
memory_limitridotto e un timeout, in modo che un errore di regressione non possa causare il crash o il blocco della suite di test. - Test relativi ai limiti delle risorse per documenti di grandi dimensioni, ai limiti di profondità di nidificazione in entrambe le direzioni, alla gestione degli spazi dei nomi nella conversione da XML a JSON, all'inserimento di markup e spazi dei nomi tramite chiavi e valori JSON, nonché a ulteriori casi di errore relativi ai file e ai file temporanei.
Documentazione
- Il file
SECURITY.mdora descrive ciò che i test garantiscono e ciò che non garantiscono, la dipendenza dalla versione di libxml2 inclusa con PHP e i limiti della libreria: non ci sono limiti di dimensione o di tempo propri, i percorsi dei file non vengono convalidati e gli spazi dei nomi non vengono preservati nella conversione da XML a JSON. - Il file
README.mddescrive il nuovo comportamento relativo alle entità, ai numeri interi di grandi dimensioni e ai caratteri non validi.
Note
- La protezione dall'espansione delle entità si basa sui limiti integrati in libxml2, che la libreria lascia abilitati (non imposta mai
LIBXML_NOENToLIBXML_PARSEHUGE). I risultati sono stati verificati su libxml2 2.10.4; altre versioni potrebbero comportarsi in modo diverso, pertanto si consiglia di eseguire la suite di test sull'ambiente di destinazione. - Per input completamente inaffidabili, aggiungere un limite di dimensione e un timeout di esecuzione personalizzati.
Log completo delle modifiche: CHANGELOG
English version
v.1.3.1
Bug-fix release for the command-line tool.
Fixed
bin/json-to-xmlnow works when the package is installed as a dependency. Since 1.1.0 the script looked forvendor/autoload.phprelative to its own location, which only exists in a checkout of the repository. In a project that installed the package,vendor/bin/json-to-xmlfailed withFailed opening required '.../vendor/autoload.php'. The script now looks for Composer's autoloader in several locations, and a regression test simulates the installed layout.
The library classes (JsonToXmlConverter, XmlToJsonConverter) are not affected: only the CLI was broken.
If you installed 1.1.0 to 1.3.0 and use the CLI from your project's vendor/bin, upgrade to 1.3.1.
Full changelog: CHANGELOG
v.1.3.0
This release hardens XmlToJsonConverter against entity-based denial of service and fixes two data-correctness issues in JsonToXmlConverter. Please read "Behavior changes" before upgrading: some inputs that were previously accepted are now rejected.
Behavior changes
XmlToJsonConverternow rejects references to entities declared in the DOCTYPE, both in attribute values and in element content, by throwing anInvalidArgumentException(exit code3from the CLI). Predefined entities (&,<,>,",') and character references (A) are unaffected.- In attribute values, reading the value expanded the entity with quadratic cost, which neither
loadXML()nor libxml2's own limits prevented. On libxml2 2.10.4, 16 MB of expanded content took about 14 s, and a crafted document of ~250 KB did not finish within a 15 s test timeout. - In element content, such references used to be silently dropped, losing data.
- If you rely on custom entities, inline them before passing the XML to the library.
- In attribute values, reading the value expanded the entity with quadratic cost, which neither
- JSON integers beyond the int64 range are now written in full. They are decoded as strings (
JSON_BIGINT_AS_STRING) instead of being rounded to a float, so12345678901234567890is no longer emitted as1.2345678901235E+19. - Characters that are not allowed in XML 1.0 are now rejected.
JsonToXmlConverterthrows anInvalidArgumentExceptionfor values containing control characters other than tab, line feed and carriage return, instead of silently producing a malformed document.
Added
- Regression tests for entity-expansion attacks (Billion Laughs, recursive entities, quadratic blowup in element content and in attribute values). The heavy payloads run in a separate PHP process with a reduced
memory_limitand a timeout, so a regression cannot crash or hang the test suite. - Tests for resource budgets on large documents, nesting depth limits in both directions, namespace handling in XML → JSON, markup and namespace injection through JSON keys and values, and additional file and temporary-file error cases.
Documentation
SECURITY.mdnow documents what the tests do and do not guarantee, the dependency on the libxml2 version bundled with PHP, and the library's limits: no size or time limits of its own, file paths are not validated, and namespaces are not preserved in XML → JSON.README.mddocuments the new behavior for entities, large integers and invalid characters.
Notes
- Entity-expansion protection relies on libxml2's built-in limits, which the library leaves enabled (it never passes
LIBXML_NOENTorLIBXML_PARSEHUGE). Results were verified on libxml2 2.10.4; other versions may behave differently, so running the test suite on your target environment is recommended. - For fully untrusted input, add your own size cap and execution timeout.
Full changelog: CHANGELOG