Suponiendo que esté preguntando esto en el contexto del desarrollo web ...
Puede detectar conjuntos de caracteres apropiados con una simple validación de expresiones regulares. Sin embargo, también puede ser víctima de un teatro de seguridad: el saneamiento de entradas es no la respuesta.
Si está intentando validar para configuraciones regionales específicas y no desea aceptar otras configuraciones regionales, puede elegir las específicas utilizando Regex. Aquí hay un ejemplo:
-
\p{InHan}
para caracteres chinos.
-
\p{InArabic}
para el árabe
-
\p{InThai}
para tailandés
Sin embargo, estoy con O'Rooney aquí: debe aceptar todo (siempre que esté validado: longitud, nulo, formato, lista blanca) y use Prepared Statements
con output sanitation
.
Advertencias sobre listas blancas basadas en lenguaje
Si insiste en ir con una lista blanca basada en rango de Unicode, tenga en cuenta que aún debe permitir [a-zA-Z0-9]
, aunque solo esté aceptando otras configuraciones regionales. En el internet chino, la gente frecuentemente escribe con letras en inglés. Por ejemplo, pueden intentar evadir la censura con caracteres abreviados (solo el texto en wikipedia, pero todavía NSFW ). Muchas personas también utilizan pinyin y los números romanos.
También puede utilizar rangos Unicode , pero cuando esté usando ideogramas / conjuntos de idiomas combinados, como CJK
(chino, japonés y coreano; creo que \p{IsHan}
es CJK
), se encontrará con muchos problemas de validación.
Si desea excluir por idioma, tendrá problemas con este concepto cuando esté esperando una entrada en japonés, pero en cambio obtenga una entrada en chino, o viceversa. El mismo concepto se aplica con coreano contra chino o japonés. Deberá encontrar los rangos Unicode apropiados, pero tenga en cuenta que algunos idiomas se superponen ocasionalmente: chino ( Hanzi ) y japonés (< a href="https://en.wikipedia.org/wiki/Kanji"> Kanji ) comparte algunos caracteres .
Debido a que le preocupa la entrada aceptada, suena como si estuviera buscando un saneamiento de entrada. Este es el enfoque equivocado. Usted debe no ser la entrada de "desinfección" que se incluye en una base de datos. La lista blanca está bien (valores aceptables, por ejemplo).
Desinfección y Validación Los comentarios son dos cosas diferentes. ¿Cuál es la diferencia?
-
La entrada de desinfección podría tener este aspecto:
stripApostrophesFromString(input);
-
La validación de entrada podría tener este aspecto:
if (input != null && input.Length == acceptableNumber && regexFormatIsValid(input) && isWithinAcceptableRanges(input)) { } else { }
Para la validación de conjuntos de caracteres, una variación de las expresiones regulares enumeradas podría ser suficiente, pero no validará la longitud, el formato, etc. Si le preocupa la inyección de SQL (y debería be) , deberías usar prepared statements
con output sanitation
.
El saneamiento de salida consiste esencialmente en convertir caracteres erróneos, como etiquetas de script, a su entidad HTML equivalente. Por ejemplo, <
se convierte en <
, y >
se convierte en >
.