2012-06-14 4 views
5

Qual è la procedura migliore per generare XML valido con PHP dal testo inviato dall'utente, ad es. Dati di vendita dell'eCommerce con e commerciali, parentesi angolari, caratteri di accento non ascii, nuove linee ecc.Rendi l'input dell'utente sicuro per XML

Quali funzioni, librerie, espressioni regolari fanno affidamento su persone?

+0

Attualmente sto usando CDATA e htmlentities, e dopo un un accento o in León provocato una trainwreck sto rimuovendo i caratteri accentati con strtr(). La cosa è che la gente del back office della compagnia odia l'output htmlentities() e il loro programmatore di Windows non sembra decodificarlo per loro. – jerrygarciuh

+0

Sembra più che si mischino le codifiche di caratteri piuttosto che un problema con lo stesso CDATA. Usare htmlentities e CDATA insieme non ha molto senso. Quindi, invece di impazzire e indovinare per uccidere qualcosa, prima scoprire dove si trova il problema. La soluzione quindi è spesso banale. Quindi, cosa esattamente non funziona? – hakre

+0

Bene, quello che abbiamo sono alcuni knucklehead che hanno utilizzato lo spazio di archiviazione astratto di Expression Engine per creare un negozio di e-commerce. Le codifiche della tabella sono impostate per corrispondere a EE. Il back office del proprietario del negozio è Windows e c'è un eseguibile di un'altra parte che accetta XML e importa in Great Plains nella casella di Windows. Mi è stato assegnato il compito di scrivere l'API che accetta le chiamate dall'eseguibile per sincronizzare i distributori, i prodotti di archiviazione e gli ordini di distribuzione e vendita al dettaglio. Non volevo racchiudere ogni elemento di input dell'utente nei tag CDATA, ma anche quando l'ho fatto ho trovato il problema accentato che soffiava shtuff up. – jerrygarciuh

risposta

4

informazioni Wrap in CDATA tag e codificare i dati con htmlentities()

'<tag><![CDATA[' . htmlentities($theData) . ']]></tag>' 

o utilizzando DOM

$dom = new DOMDocument("1.0", "utf-8"); 

/* ... */ 

$dom->createCDATASection(htmlentities($theData)); 
+0

Ci scusiamo ma la risposta sembra un po 'come se non avessi idea di cosa sia il CDATA e cosa abbia o meno a che fare con esso. – hakre

1

Se si desidera la sicurezza binaria, è necessario utilizzare un'ulteriore codifica di trasporto. Ad esempio, è possibile utilizzare base64 o uuencode per archiviare i dati in modo sicuro binario all'interno di un blocco XML.