Supponendo che lo stai chiedendo nel contesto dello sviluppo Web ...
È possibile rilevare set di caratteri appropriati con una semplice conferma delle espressioni regolari. Tuttavia, potresti anche essere vittima di un teatro di sicurezza: l'igienizzazione dell'input è non la risposta.
Se si sta tentando di convalidare per impostazioni locali specifiche e non si desidera accettare altre impostazioni locali, è possibile scegliere quelle specifiche utilizzando Regex. Ecco un esempio:
-
\p{InHan}
per caratteri cinesi.
-
\p{InArabic}
per l'arabo
-
\p{InThai}
per Thai
Tuttavia, sono con O'Rooney qui: dovresti accettare tutto (finché è convalidato: length, null, format, whitelist) e usare Prepared Statements
con output sanitation
.
Avvertenze sulla whitelist basata sulla lingua
Se insisti ad andare con una lista bianca basata su unicode, tieni presente che devi comunque consentire [a-zA-Z0-9]
, anche se stai accettando solo altre impostazioni locali. Sull'Internet cinese, le persone scrivono spesso con lettere inglesi. Ad esempio, possono tentare di eludere la censura tramite caratteri abbreviati (solo testo su wikipedia, ma comunque NSFW ). Molte persone usano anche pinyin e numeri romani.
Puoi anche utilizzare intervalli Unicode , ma quando si utilizzano ideogrammi combinati / set di lingue come CJK
(cinese, giapponese e coreano, credo che \p{IsHan}
sia CJK
), si verificheranno molti problemi di convalida.
Se vuoi escludere per lingua, avrai problemi con questo concetto quando ti aspetti input giapponesi, ma ottieni input cinesi, o viceversa. Lo stesso concetto si applica con il coreano contro il cinese o il giapponese. Dovrai trovare gli intervalli di unicode appropriati, ma nota che alcune lingue si sovrappongono occasionalmente: cinese ( Hanzi ) e giapponese (< a href="https://en.wikipedia.org/wiki/Kanji"> Kanji ) condividi alcuni personaggi .
Dato che sei preoccupato per gli input accettati, sembra che tu stia cercando un risanamento dei dati. Questo è l'approccio sbagliato. Dovresti non essere input "disinfettanti" che va in un database. La whitelist va bene (valori accettabili, ad esempio).
Gli elementi di Sanitizzazione e Validazione sono due cose diverse. Qual è la differenza?
-
Input di disinfezione potrebbe assomigliare a questo:
stripApostrophesFromString(input);
-
La convalida dell'input potrebbe essere simile a questa:
if (input != null && input.Length == acceptableNumber && regexFormatIsValid(input) && isWithinAcceptableRanges(input)) { } else { }
Per la convalida del set di caratteri, una variazione delle espressioni regolari elencate può essere sufficiente, ma non convalida la lunghezza, il formato, ecc. Se sei preoccupato dell'iniezione SQL (e dovresti be) , dovresti utilizzare prepared statements
con output sanitation
.
Il risanamento dell'output consiste essenzialmente nel convertire i caratteri non validi, come i tag di script, nella loro equivalente entità HTML. Ad esempio, <
diventa <
e >
diventa >
.