Te recomendamos que pruebes esta resolución en un ambiente controlado antes de pasarlo a producción, un saludo.
Solución:
Simpatizo con la necesidad de restringir la entrada en esta situación, pero no creo que sea posible: Unicode es enorme y se expande, al igual que el subconjunto que se usa en los nombres en todo el mundo.
A diferencia del correo electrónico, no existe un estándar universalmente acordado para los nombres que las personas pueden usar, o incluso qué representaciones pueden registrar como oficiales con sus respectivos gobiernos. Sospecho que cualquier expresión regular eventualmente no pasará un nombre considerado válido por alguien, algun lado en el mundo.
Por supuesto, necesita desinfectar o escapar de la entrada para evitar el problema de Little Bobby Tables. Y también puede haber otras restricciones sobre qué entrada permite, como los sistemas subyacentes utilizados para almacenar, representar o manipular nombres. Como tal, le recomiendo que determine primero las restricciones que necesita el sistema al que pertenece su validación y cree una expresión de validación basada únicamente en ellas. Esto aún puede causar inconvenientes en algunos escenarios, pero deberían ser raros.
Intentaré dar una respuesta adecuada yo mismo:
Las únicas puntuaciones que deben permitirse en un nombre son el punto, el apóstrofo y el guión. No he visto ningún otro caso en la lista de casos de esquina.
Con respecto a los números, solo hay un caso con un 8. Creo que puedo rechazar eso con seguridad.
En cuanto a las letras, cualquier letra es válida.
También quiero incluir espacio.
Esto se sumaría a esta expresión regular:
^[pL .'-]+$
Esto presenta un problema, es decir, el apóstrofe se puede utilizar como vector de ataque. Debe estar codificado.
Entonces, el código de validación debería ser algo como esto (no probado):
var name = nameParam.Trim();
if (!Regex.IsMatch(name, "^[pL .-]+$"))
throw new ArgumentException("nameParam");
name = name.Replace("'", "'"); //' does not work in IE
¿Alguien puede pensar en una razón por la que un nombre no debería pasar esta prueba o una inyección XSS o SQL que podría pasar?
solución probada completa
using System;
using System.Text.RegularExpressions;
namespace test
class MainClass
public static void Main(string[] args)
var names = new string[]"Hello World",
"John",
"João",
"タロウ",
"やまだ",
"山田",
"先生",
"мыхаыл",
"Θεοκλεια",
"आकाङ्क्षा",
"علاء الدين",
"אַבְרָהָם",
"മലയാളം",
"상",
"D'Addario",
"John-Doe",
"P.A.M.",
"' --",
"",
"""
;
foreach (var nameParam in names)
Console.Write(nameParam+" ");
var name = nameParam.Trim();
if (!Regex.IsMatch(name, @"^[pLpM' .-]+$"))
Console.WriteLine("fail");
continue;
name = name.Replace("'", "'");
Console.WriteLine(name);
Simplemente permitiría todo (excepto un vacío string) y supongamos que el usuario sabe cuál es su nombre.
Hay 2 casos comunes:
- Le importa que el nombre sea exacto y que se valide contra un pasaporte de papel real u otro documento de identidad, o contra una tarjeta de crédito.
- No le importa mucho y el usuario podrá registrarse como “Fred Smith” (o “Jane Doe”) de todos modos.
En el caso (1), puede permitir todos los caracteres porque está comparando con un documento en papel.
En el caso (2), también puede permitir todos los caracteres porque “123 456” no es peor seudónimo que “Abc Def”.
Te mostramos las comentarios y valoraciones de los usuarios
Si te gustó nuestro trabajo, tienes el poder dejar una sección acerca de qué le añadirías a este escrito.